预计不会等待整个输出 - Ubuntu
Pexpect not waiting for whole output - Ubuntu
我有一个简单的脚本可以通过 SSH 连接到网络交换机和 运行 命令并将输出保存到一个文件中。它适用于立即显示的输出,但当我 运行 "show iproute" 它不捕获任何输出。原因是当我直接在 switch 上 运行 相同的命令时,它会思考 5-6 秒,显示一堆行并再次思考并显示更多行然后结束。它没有正确等待整个命令执行我有问题修复:
str_prompt = ' # '
command = "sh iproute"
device_name = "switch1.test.com"
# Spawn SSH session
ssh_command = 'ssh {}@{}'.format(username, device_name)
session = pexpect.spawn(ssh_command, timeout=5)
# Send the password
session.sendline(password)
# Expect the switch prompt (successful login)
expect_index = session.expect([pexpect.TIMEOUT, str_prompt])
# Success
if expect_index == 1:
# Disable clipaging so that all the output is shown (not in pages) | same as term len 0 in Cisco
session.sendline('disable clip')
# Expect the switch prompt if command is successful
expect_index = session.expect([pexpect.TIMEOUT, str_prompt])
# Send show iproute command
session.sendline(command)
# < This is where it needs to wait >
#session.expect(pexpect.EOF) - Tried this and wait() but that broke the scipt
#session.wait()
# Expect the switch prompt if command is successful
session.expect(str_prompt)
# Save output of "sh iproute" to a variable
output = session.before
# Save results to a file
fp = open(host + '-route.txt', "w")
fp.write(output)
fp.close()
这是一个示例输出。输出确实有“#”但没有“#”。
#oa 10.10.10.0/24 10.0.0.1 4 UG-D---um--f- V-BB1 99d:0h:14m:49s
#oa 10.10.20.0/24 10.0.0.1 4 UG-D---um--f- V-BB2 99d:0h:14m:49s
#oa 10.10.30.0/24 10.0.0.1 4 UG-D---um--f- V-BB3 99d:0h:14m:49s
#oa 10.10.40.0/24 10.0.0.1 4 UG-D---um--f- V-BB4 99d:0h:14m:49s
and many more line ....
如有任何帮助,我们将不胜感激。谢谢
编辑:
我添加了 sleep(60),这似乎可以解决问题,但我不想使用它,因为我发送了多个命令,而且有些命令非常快。我不想为每个命令等待 1 分钟,脚本将永远花费 运行.
因此您需要将超时与命令相关联。
我今天这样做的方法是使用我的代码解析的 xml 文件格式,xml 标记将具有命令属性和超时属性,命令的 end_prompt 属性和等等..
我的代码读取命令及其超时,并在发送命令之前相应地设置相应的变量。
session.sendline(command) #command is read from a xml file
session.expect(end_prompt, timeout=int(tmout)) # end_prompt, tmout for the command read form the same file
对于您的情况,如果您不想解析文件以获取命令及其相关参数,您可以将它们作为脚本中的字典并使用它
command_details_dict = { "cmd_details" :[
{'cmd': 'pwd',
'timeout': 5,
},
{'cmd': 'iproute',
'timeout': 60,
}
]
}
字典里面 cmd_details 是一个字典列表,这样你可以在迭代时保持命令的顺序,每个命令都是一个包含相关细节的字典,你可以向命令字典添加更多的键,比如提示,唯一标识符等..
但是如果你有时间我建议改用配置文件
我有一个简单的脚本可以通过 SSH 连接到网络交换机和 运行 命令并将输出保存到一个文件中。它适用于立即显示的输出,但当我 运行 "show iproute" 它不捕获任何输出。原因是当我直接在 switch 上 运行 相同的命令时,它会思考 5-6 秒,显示一堆行并再次思考并显示更多行然后结束。它没有正确等待整个命令执行我有问题修复:
str_prompt = ' # '
command = "sh iproute"
device_name = "switch1.test.com"
# Spawn SSH session
ssh_command = 'ssh {}@{}'.format(username, device_name)
session = pexpect.spawn(ssh_command, timeout=5)
# Send the password
session.sendline(password)
# Expect the switch prompt (successful login)
expect_index = session.expect([pexpect.TIMEOUT, str_prompt])
# Success
if expect_index == 1:
# Disable clipaging so that all the output is shown (not in pages) | same as term len 0 in Cisco
session.sendline('disable clip')
# Expect the switch prompt if command is successful
expect_index = session.expect([pexpect.TIMEOUT, str_prompt])
# Send show iproute command
session.sendline(command)
# < This is where it needs to wait >
#session.expect(pexpect.EOF) - Tried this and wait() but that broke the scipt
#session.wait()
# Expect the switch prompt if command is successful
session.expect(str_prompt)
# Save output of "sh iproute" to a variable
output = session.before
# Save results to a file
fp = open(host + '-route.txt', "w")
fp.write(output)
fp.close()
这是一个示例输出。输出确实有“#”但没有“#”。
#oa 10.10.10.0/24 10.0.0.1 4 UG-D---um--f- V-BB1 99d:0h:14m:49s
#oa 10.10.20.0/24 10.0.0.1 4 UG-D---um--f- V-BB2 99d:0h:14m:49s
#oa 10.10.30.0/24 10.0.0.1 4 UG-D---um--f- V-BB3 99d:0h:14m:49s
#oa 10.10.40.0/24 10.0.0.1 4 UG-D---um--f- V-BB4 99d:0h:14m:49s
and many more line ....
如有任何帮助,我们将不胜感激。谢谢
编辑: 我添加了 sleep(60),这似乎可以解决问题,但我不想使用它,因为我发送了多个命令,而且有些命令非常快。我不想为每个命令等待 1 分钟,脚本将永远花费 运行.
因此您需要将超时与命令相关联。 我今天这样做的方法是使用我的代码解析的 xml 文件格式,xml 标记将具有命令属性和超时属性,命令的 end_prompt 属性和等等..
我的代码读取命令及其超时,并在发送命令之前相应地设置相应的变量。
session.sendline(command) #command is read from a xml file
session.expect(end_prompt, timeout=int(tmout)) # end_prompt, tmout for the command read form the same file
对于您的情况,如果您不想解析文件以获取命令及其相关参数,您可以将它们作为脚本中的字典并使用它
command_details_dict = { "cmd_details" :[
{'cmd': 'pwd',
'timeout': 5,
},
{'cmd': 'iproute',
'timeout': 60,
}
]
}
字典里面 cmd_details 是一个字典列表,这样你可以在迭代时保持命令的顺序,每个命令都是一个包含相关细节的字典,你可以向命令字典添加更多的键,比如提示,唯一标识符等..
但是如果你有时间我建议改用配置文件