考虑从Perl迁移到运行脚本的Python,以自动执行远程服务器和设备上的某些任务。我们需要能够使用Expect检查某些结果并获取数据。看看Paramiko-Expect,我喜欢它,但每次都超时。
import paramiko
from paramikoe import SSHClientInteraction
HOSTNAME = "HOST IP"
PASSWORD = "PWORD"
USERNAME = "UNAME"
PROMPT = "(node name)#"
command = "show command"
print PROMPT
file = open("testlog.txt","w")
def main():
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(HOSTNAME, port=22, username=USERNAME, password=PASSWORD)
interact = SSHClientInteraction(client, timeout=10, display=True)
interact.send(command)
interact.expect(PROMPT)
file.write(interact.current_output_clean)
client.close()
return
main()
file.close()
这是我得到的追溯:
Traceback (most recent call last):
File "python_test.py", line 40, in <module>
main()
File "python_test.py", line 28, in main
interact.expect(PROMPT)
File "/usr/local/lib/python2.7/site-packages/paramikoe.py", line 122, in expect
buffer = self.channel.recv(self.buffer_size)
File "/usr/local/lib/python2.7/site-packages/paramiko/channel.py", line 598, in recv
raise socket.timeout() socket.timeout
我已经尝试过多个版本的PROMPT,直接将我正在尝试的节点文本放到完整的正则表达式中。什么都行不通。当它到达client.expect时总是超时。 Paramiko-expect文档没有帮助,我看到这个问题的唯一其他地方是不同的,它没有帮助。 任何建议都表示赞赏。
答案 0 :(得分:1)
提示您想要的东西,如...提示。 Here是paramiko互动示例。请注意第21行和第37行 -
PROMPT = 'vagrant@paramiko-expect-dev:~\$\s+'
interact.expect(PROMPT)
所以,当我将部分代码更新为:
interact = SSHClientInteraction(client, timeout=10, display=True)
interact.expect(PROMPT)
interact.send("ls")
interact.expect(".*Maildir.*")
file.write(interact.current_output_clean)
client.close()
我有testlog.txt
填写了远程主机的主目录列表。
作为旁注 - 切换到python 3.如果你正在开始,最好使用众所周知的工具很快就会过时。您也可以使用ipython或jupyter - 代码将更具交互性,更快地进行测试。也许netmiko会对你感兴趣吗?