预期匹配问题
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
这里,在配置新的 ip
s 之前,我试图删除旧的 ip
s。所以我试图匹配 ip 地址,然后将指令发送到 delete
即 ip
.
所以我希望 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捕获的内容。它应该在两种情况下都有效(只有一个地址,以及更多)
我有一个 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
这里,在配置新的 ip
s 之前,我试图删除旧的 ip
s。所以我试图匹配 ip 地址,然后将指令发送到 delete
即 ip
.
所以我希望 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捕获的内容。它应该在两种情况下都有效(只有一个地址,以及更多)