【问题标题】:How to let Python code continue after telnet (telnetlib) timeouttelnet(telnetlib)超时后如何让Python代码继续
【发布时间】:2011-07-18 21:28:51
【问题描述】:

我正在使用 Python 进行使用 telnetlib 的自动 telnet 程序。问题是:当我尝试远程登录的设备没有响应时,意味着超时;该程序给了我超时消息,并且不会继续执行下一个命令。

我的代码:

import telnetlib  
HOST = ("x.x.x.x")  
USER = ("xxxxx")  
PWD = ("yyyyy")  
ENABLE = ("zzzzz")  
TNT = telnetlib.Telnet(HOST, 23, 5)                    
TNT.read_until(b"Username:")  
TNT.write(USER.encode('ascii') + b"\n")  
TNT.read_until(b"Password:")  
TNT.write(PWD.encode('ascii') + b"\n")  
TNT.write(b"enable\n")  
TNT.read_until(b"Password:")  
TNT.write(ENABLE.encode('ascii') + b"\n")  
TNT.write(b"terminal length 0\n")  
TNT.write(b"show run\n")  
TNT.write(b"exit\n")  
print (TNT.read_all().decode('ascii'))  
TNT.close()  
raw_input ("Press any Key to Quit: ")  

错误信息:

Traceback (most recent call last):  
  File "D:\Python\Telnet (Python 2.7) V1.5.py", line 8, in <module>  
    TNT = telnetlib.Telnet(HOST, 23, 5)  
  File "C:\Python27\lib\telnetlib.py", line 209, in __init__  
    self.open(host, port, timeout)  
  File "C:\Python27\lib\telnetlib.py", line 225, in open  
    self.sock = socket.create_connection((host, port), timeout)  
  File "C:\Python27\lib\socket.py", line 571, in create_connection  
    raise err  
timeout: timed out  
>>> 

如何让程序只通知我此设备无法访问并让它继续执行下一个命令??

【问题讨论】:

    标签: python timeout telnetlib


    【解决方案1】:

    每当异常到来时,Python 都会终止您的程序。要处理异常,您需要将其包装在 try、catch 语句中。

    将您的 telnet 语句放入 try 语句并使用 except 捕获异常,如下所示:

    import telnetlib  
    HOST = ("x.x.x.x")  
    USER = ("xxxxx")  
    PWD = ("yyyyy")  
    ENABLE = ("zzzzz")  
    try:
        TNT = telnetlib.Telnet(HOST, 23, 5)                    
    except:
        print "<your custom message>"
        pass
    TNT.read_until(b"Username:")  
    TNT.write(USER.encode('ascii') + b"\n")  
    TNT.read_until(b"Password:")  
    TNT.write(PWD.encode('ascii') + b"\n")  
    TNT.write(b"enable\n")  
    TNT.read_until(b"Password:")  
    TNT.write(ENABLE.encode('ascii') + b"\n")  
    TNT.write(b"terminal length 0\n")  
    TNT.write(b"show run\n")  
    TNT.write(b"exit\n")  
    print (TNT.read_all().decode('ascii'))  
    TNT.close()  
    raw_input ("Press any Key to Quit: ")  
    

    【讨论】:

      【解决方案2】:

      您正在寻找的例外是socket.timeout。所以:

      import socket
      try:
          TNT = telnetlib.Telnet(HOST, 23, 5)
      except socket.timeout:
          sulk()
      

      我是这样发现的:

      >>> try:
      ...   t = telnetlib.Telnet("google.com", 23, 5)
      ... except:
      ...   import sys
      ...   exc_info = sys.exc_info()
      >>> exc_info
      (<class 'socket.timeout'>, timeout('timed out',), <traceback object at 0xb768bf7c>)
      

      可能是timeout 太具体了。你可能更喜欢捕捉 any IOError

      try:
          TNT = telnetlib.Telnet(HOST, 23, 5)
      except IOError:
          sulk()
      

      【讨论】:

        【解决方案3】:

        将操作包装在 try 块中,并在 catch 块中处理异常。

        【讨论】:

        • 嗨安德鲁,请你澄清你的答案。我没有编程经验。可以举个例子吗?
        • 嗨,安德鲁,我明白你的意思了。但是我必须在异常语句中指定的错误应该是什么。超时未定义错误!
        猜你喜欢
        • 2012-09-07
        • 2022-11-25
        • 1970-01-01
        • 2020-11-20
        • 2011-12-31
        • 1970-01-01
        • 2021-01-19
        • 2017-08-16
        • 2022-11-25
        相关资源
        最近更新 更多