我正在尝试在路由器的所有端口上进行自动以太网带宽测试。我的设置涉及从具有1个连接的Windows PC到路由器连接到具有7个连接的Linux PC。我正在使用Paramiko模块通过SSH连接到Linux PC来启动以太网测试,该测试工作正常。
但是,我想看看如果我在测试中移除了以太网电缆会发生什么。这会导致程序崩溃,说“尝试对无法访问的主机执行套接字操作”。我希望能够避免这个错误。有没有办法检查连接是否可能,以便我不会崩溃?理想情况下,我希望代码跳过错误的连接并继续下一个电缆。以下是使用代码的片段:
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()
答案 0 :(得分:0)
避免此错误的最简单方法是不要做导致它的原因 - 拉动电缆。但是,您似乎希望能够在您的程序中处理它,所以这里有一些选项! (我假设此代码段基于主机列表驻留在某种循环中。)
选项1:
在尝试连接之前,您可以抢先检查该地址的主机是否处于活动状态。将{s}连接代码包含在if
语句中并以os.system("ping -c 1 " + target_host[i]) is 0
作为条件将允许您跳过死宿主上的连接。
选项2:
另一种方法是首先尝试并处理失败。如果您在查看ssh.connect(...)
的try-except块中包装从ssh.close()
到paramiko.ssh_exception.NoValidConnectionsError
的所有内容,则可以按照您的喜好处理失败的连接并继续执行该程序。一个例子:
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