预期匹配问题

Issue with pexpect match

我有一个 python-pexpect 代码片段是这样的:

while True:
    master.sendline("show rsu-set all")
    status=master.expect(["[sS]nmp.*[ ]*=[ ]*[0-9].*[0-9]","Savari>>",TIMEOUT,EOF],4)
    if status == 0:
        old_slave_ip = master.match.group().split("=")[1]
        master.sendline("config rsu-set delete "+old_slave_ip)
        master.expect("Savari>>")

        master.sendline("config rsu-set commit")
        master.expect("Savari>>")
        continue
    elif status == 1:
        break
    else:
        print "Timed out or EOF reached"
        exit_flag = 1
        exit(1)

shell 的实际输出:

Savari>> show rsu-set all 

Mode                = master
SnmpSlaveIPAddress  = 192.168.20.204
SnmpSlaveIPAddress  = 192.168.20.210

这里,在配置新的 ips 之前,我试图删除旧的 ips。所以我试图匹配 ip 地址,然后将指令发送到 deleteip.

所以我希望 ip 使用 "[sS]nmp.*[ ]*=[ ]*[0-9].*[0-9]",然后使用 split() 方法提取 ip

我原以为 old_slave_ip 值只是 ip 地址。但它也有下一行的 SnmpSlaveIPAddress,这导致了一些不当行为。

脚本的输出如下:

Savari>> show rsu-set all

Mode                = master
SnmpSlaveIPAddress  = 192.168.20.204
SnmpSlaveIPAddress  = 192.168.20.210

Savari>> config rsu-set delete  192.168.20.204

Savari>>

Savari>> SnmpSlaveIPAddress
          ^Command not found

Savari>> config rsu-set commit

Savari>> show rsu-set all

Mode                = master
SnmpSlaveIPAddress  = 192.168.20.210

Savari>> config rsu-set delete  master

Invalid value

这是一个无限循环。

当只有一个 ip 地址时脚本工作正常。只有当列表中有多个 ip 时才会发生这种情况。

请帮我解决这个问题。

提前致谢

当您的 'expect' 仅匹配一个地址时,它会得到类似于:

SnmpSlaveIPAddress  = 192.168.20.204

但如果有更多地址,它会捕获比您真正想要的更多的地址,例如:

SnmpSlaveIPAddress  = 192.168.20.204
SnmpSlaveIPAddress  =

因此,您的 'old_slave_ip' 获得了地址,加上您不想要的部分。 为了摆脱它,我会尝试:

old_slave_ip = master.match.group().split("=")[1].split('\n')[0]

也就是说,只有第一行被expect捕获的内容。它应该在两种情况下都有效(只有一个地址,以及更多)