让 python 3 代码在 telnetlib 超时后继续

Let python 3 code continue after telnetlib timeout

我正在尝试加载一个包含 IP 地址的文件,远程登录到它们,发送一些命令并保存 output.I 让它正常工作并且输出看起来符合预期。

我的问题是,如果文件中有一个 IP 地址无法访问并且 telnetlib 超时。然后完整的脚本停止。 我想忽略超时的 IP 地址并继续处理文件的其余部分。

#!/usr/bin/env python3

import pexpect
import getpass
import telnetlib
import socket

ipfile = input("Enter site (IP address file): ")
user = input("Enter username: ")
password = getpass.getpass("Enter password")
outputfile = ((ipfile)+".output")

f = open(outputfile, 'w')
f.write("")
f.close()

with open(ipfile) as ips:
   all_ips = [x.rstrip() for x in ips] # get all ips in a list and strip newline
for ip in all_ips:
   tn = telnetlib.Telnet(ip,23,2)
   tn.read_until(b"Username: ")
   tn.write(user.encode('ascii') + b"\n")
   if password:
     tn.read_until(b"Password: ")
     tn.write(password.encode('ascii') + b"\n")
     tn.write(b"term len 0\n")
     tn.write(b"sh inven\n")
     tn.write(b"logout\n")
#    print(tn.read_all().decode('ascii'))
     with open(outputfile,"ab") as f: #write to a file
       f.write(tn.read_all())                     

我得到的错误是

    Traceback (most recent call last):
  File "./test4.py", line 22, in <module>
    tn = telnetlib.Telnet(ip,  23,2)
  File "/usr/lib/python3.5/telnetlib.py", line 218, in __init__
    self.open(host, port, timeout)
  File "/usr/lib/python3.5/telnetlib.py", line 234, in open
    self.sock = socket.create_connection((host, port), timeout)
  File "/usr/lib/python3.5/socket.py", line 711, in create_connection
raise err
  File "/usr/lib/python3.5/socket.py", line 702, in create_connection
    sock.connect(sa)
socket.timeout: timed out

如果您特别想捕获套接字超时,您可以执行以下操作...

import socket
import telnetlib

ip = '127.0.0.1'

try:
    tn = telnetlib.Telnet(ip, 23, 2)
except socket.timeout:
    print("connection time out caught.")
    # handle error cases here...

我想我明白了。

#!/usr/bin/env python3

import pexpect
import getpass
import telnetlib
import socket

ipfile = input("Enter site (IP address file): ")
user = input("Enter username: ")
password = getpass.getpass("Enter password: ")
outputfile = ((ipfile)+".output")

f = open(outputfile, 'w')
f.write("")
f.close()

with open(ipfile) as ips:
   all_ips = [x.rstrip() for x in ips] # get all ips in a list and strip newline
for ip in all_ips:
 try:
    tn = telnetlib.Telnet(ip,23,2)
    tn.read_until(b"Username: ")
    tn.write(user.encode('ascii') + b"\n")
    if password:
     tn.read_until(b"Password: ")
     tn.write(password.encode('ascii') + b"\n")
     tn.write(b"term len 0\n")
     tn.write(b"sh inven\n")
     tn.write(b"logout\n")
#    print(tn.read_all().decode('ascii'))
     with open(outputfile,"ab") as f: #write to a fil
       f.write(tn.read_all())
 except socket.timeout:
    print((ip)+" timeout")