使用 paramiko 检查是否可以完成 SSH
Using paramiko to check if an SSH can be done
我正在尝试对路由器的所有端口进行自动以太网带宽测试。我的设置涉及从具有 1 个连接的 Windows PC 连接到路由器到具有 7 个连接的 Linux PC。我正在使用 Paramiko 模块通过 SSH 连接到 Linux PC 以启动以太网测试,它工作正常。
但是,我想看看如果我在测试中移除其中一根以太网电缆会发生什么。这会导致程序崩溃,显示 "socket operation was attempted to an unreachable host"。我希望能够避免这个错误。有没有办法检查连接是否可行,这样我就不会崩溃?理想情况下,我希望代码跳过不良连接并继续处理下一根电缆。这是使用的代码片段:
ssh.connect( hostname = target_host[i] , username = un, password = pwd )
stdin, stdout, stderr = ssh.exec_command('iperf -c 192.168.0.98')
t_read=stdout.read()
read[i]=t_read[360:375]
raw_speed[i]=t_read[360:364]
address[i]=t_read[221:233]
print('Receieved data on cable %s from %s via IP: %s at %s \n'%(Cable[i],WMI_Port[i],address[i],read[i]))
stdin, stdout, stderr = ssh.exec_command('sudo ifconfig %s down'%(target_eth[i]))
print ('Disabling %s : \n\n'%(WMI_Port[i]))
ssh.close()
避免此错误的最简单方法是不执行导致错误的操作 - 拉电缆。但是,您似乎希望能够在您的程序中处理它,所以这里有一些选择! (我假设此代码段位于基于主机列表的某种循环中。)
选项 1:
您可以在尝试连接之前抢先检查该地址的主机是否处于活动状态。将 ssh 连接代码包装在 if
语句中,以 os.system("ping -c 1 " + target_host[i]) is 0
作为条件将允许您跳过死机上的连接。
选项 2:
另一种方法是先尝试然后处理失败。如果将 ssh.connect(...)
到 ssh.close()
的所有内容都包装在监视 paramiko.ssh_exception.NoValidConnectionsError
的 try-except 块中,您可以根据需要处理失败的连接并继续执行该程序。这方面的一个例子:
for i in len(target_host):
try:
ssh.connect( hostname = target_host[i] , username = un, password = pwd )
stdin, stdout, stderr = ssh.exec_command('iperf -c 192.168.0.98')
t_read=stdout.read()
read[i]=t_read[360:375]
raw_speed[i]=t_read[360:364]
address[i]=t_read[221:233]
print('Receieved data on cable %s from %s via IP: %s at %s \n'%(Cable[i],WMI_Port[i],address[i],read[i]))
stdin, stdout, stderr = ssh.exec_command('sudo ifconfig %s down'%(target_eth[i]))
print ('Disabling %s : \n\n'%(WMI_Port[i]))
ssh.close()
except paramiko.ssh_exception.NoValidConnectionsError as error:
print("Failed to connect to host '%s' with error: %s" % (target_host[i], error))
该异常可能与您转储时得到的不完全相同,因此请将其替换为您之前得到的异常。处理程序与预期异常的匹配越紧密越好。过于宽泛的处理程序会吞噬您需要查看的异常,从而导致静默失败。
有关 Paramiko 异常的更多信息,请查看此处:http://docs.paramiko.org/en/2.4/api/ssh_exception.html
有关 Python 3 中处理异常的信息:
https://docs.python.org/3/tutorial/errors.html
我正在尝试对路由器的所有端口进行自动以太网带宽测试。我的设置涉及从具有 1 个连接的 Windows PC 连接到路由器到具有 7 个连接的 Linux PC。我正在使用 Paramiko 模块通过 SSH 连接到 Linux PC 以启动以太网测试,它工作正常。
但是,我想看看如果我在测试中移除其中一根以太网电缆会发生什么。这会导致程序崩溃,显示 "socket operation was attempted to an unreachable host"。我希望能够避免这个错误。有没有办法检查连接是否可行,这样我就不会崩溃?理想情况下,我希望代码跳过不良连接并继续处理下一根电缆。这是使用的代码片段:
ssh.connect( hostname = target_host[i] , username = un, password = pwd )
stdin, stdout, stderr = ssh.exec_command('iperf -c 192.168.0.98')
t_read=stdout.read()
read[i]=t_read[360:375]
raw_speed[i]=t_read[360:364]
address[i]=t_read[221:233]
print('Receieved data on cable %s from %s via IP: %s at %s \n'%(Cable[i],WMI_Port[i],address[i],read[i]))
stdin, stdout, stderr = ssh.exec_command('sudo ifconfig %s down'%(target_eth[i]))
print ('Disabling %s : \n\n'%(WMI_Port[i]))
ssh.close()
避免此错误的最简单方法是不执行导致错误的操作 - 拉电缆。但是,您似乎希望能够在您的程序中处理它,所以这里有一些选择! (我假设此代码段位于基于主机列表的某种循环中。)
选项 1:
您可以在尝试连接之前抢先检查该地址的主机是否处于活动状态。将 ssh 连接代码包装在 if
语句中,以 os.system("ping -c 1 " + target_host[i]) is 0
作为条件将允许您跳过死机上的连接。
选项 2:
另一种方法是先尝试然后处理失败。如果将 ssh.connect(...)
到 ssh.close()
的所有内容都包装在监视 paramiko.ssh_exception.NoValidConnectionsError
的 try-except 块中,您可以根据需要处理失败的连接并继续执行该程序。这方面的一个例子:
for i in len(target_host):
try:
ssh.connect( hostname = target_host[i] , username = un, password = pwd )
stdin, stdout, stderr = ssh.exec_command('iperf -c 192.168.0.98')
t_read=stdout.read()
read[i]=t_read[360:375]
raw_speed[i]=t_read[360:364]
address[i]=t_read[221:233]
print('Receieved data on cable %s from %s via IP: %s at %s \n'%(Cable[i],WMI_Port[i],address[i],read[i]))
stdin, stdout, stderr = ssh.exec_command('sudo ifconfig %s down'%(target_eth[i]))
print ('Disabling %s : \n\n'%(WMI_Port[i]))
ssh.close()
except paramiko.ssh_exception.NoValidConnectionsError as error:
print("Failed to connect to host '%s' with error: %s" % (target_host[i], error))
该异常可能与您转储时得到的不完全相同,因此请将其替换为您之前得到的异常。处理程序与预期异常的匹配越紧密越好。过于宽泛的处理程序会吞噬您需要查看的异常,从而导致静默失败。
有关 Paramiko 异常的更多信息,请查看此处:http://docs.paramiko.org/en/2.4/api/ssh_exception.html
有关 Python 3 中处理异常的信息: https://docs.python.org/3/tutorial/errors.html