【发布时间】:2014-01-02 09:15:30
【问题描述】:
以下代码从文本文件中获取 IP 地址(Cisco 路由器)并执行上述命令并将结果输出打印到文件中。这里我尝试首先使用 PING 测试设备的可达性,成功的 ping 响应命令应该被执行,否则应该打印一个错误并移动到下一个主机。请帮助我如何实现这一目标。我是新手。
这是我的代码,
import paramiko
import sys
import os
import subprocess
with open('C:\Python27\Testing\Fetch.txt') as f:
for line in f:
line = line.strip()
dssh = paramiko.SSHClient()
dssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
dssh.connect(line, username='cisco', password='cisco')
stdin, stdout, stderr = dssh.exec_command('sh ip ssh')
mystring = stdout.read()
print mystring
f = open('C:\Python27\Testing\output.txt', 'a+')
f.write(mystring)
f.close()
dssh.close()
输入文件 Fetch.txt 长这样,
10.0.0.1
10.0.0.2
10.0.0.3
10.0.0.4
10.0.0.5
我浏览了论坛并获得了我正在寻找的内容。如果该列表中的所有 IP 地址都可以访问,那么脚本就可以正常工作。但是,如果任何一个 IP 地址无法访问,则脚本会突然结束,而不会继续执行下一个 IP 地址。我意识到这里做错了,我只需要一点点帮助就可以让它工作......请帮忙。
import paramiko
import sys
import os
import subprocess
dssh = paramiko.SSHClient()
dssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
with open('C:\Python27\Testing\Fetch.txt') as f:
for line in f:
line = line.strip()
with open(os.devnull, "wb") as limbo:
ip = line
result = subprocess.Popen(["ping", "-n", "1", "-w", "200", ip],
stdout=limbo, stderr=limbo).wait()
if result:
print ip, "Down"
else:
print ip, "Reachable"
dssh.connect(line, username='cisco', password='cisco')
stdin, stdout, stderr = dssh.exec_command('sh ip ssh')
mystring = stdout.read()
print mystring
f = open('C:\Python27\Testing\output.txt', 'a+')
f.write('\n' + ip + '\n' + mystring)
f.close()
dssh.close()
【问题讨论】:
-
你能修复以 dssh.connect() 开头的部分的缩进吗?这样看起来它失败了,因为 ssh 连接代码在 for 循环之外。这样它总是在最终主机上执行,无论它是向上还是向下。我确定它应该在 else: block 中
-
非常感谢。你的建议奏效了......
-
路由器等嵌入式设备特有的一个问题:它们通常不实现整个 SSH 协议。
exec_command(),当你在这里使用它时,只有当ssh router_ip "sh ip ssh"也可以工作时才会工作——如果你不能从 OpenSSH 客户端成功运行它(使用命令行上的命令,连接后没有输入),那么这个 Paramiko 代码也不起作用。 -
...如果这不起作用,您需要改用
invoke_shell(),并使用类似期望的逻辑来等待提示、发送命令字符串等.
标签: python output ping paramiko cisco