Python Telnet脚本报错SyntaxError: unexpected EOF while parsing求助
解决你的Telnet脚本语法错误和逻辑问题
首先,你遇到的SyntaxError: unexpected EOF while parsing是因为外层的try块没有对应的except或finally语句来闭合。Python要求所有的try必须有至少一个except或者finally分支,否则解析到文件末尾时会认为代码结构不完整,直接抛出语法错误。
除此之外,你的代码还有几个关键的逻辑问题需要修正,我一步步给你拆解:
主要错误点
1. 未闭合的外层try块
你开头写了try:,但整个代码到结尾都没有对应的except或finally分支来匹配,这是导致语法错误的直接原因。必须给外层try添加异常处理分支,哪怕只是捕获通用异常或者用finally来做资源清理。
2. Telnet对象未正确实例化
你写了tn = telnetlib.Telnet,这只是把Telnet类本身赋值给了变量,而不是创建一个连接到目标设备的Telnet实例。正确的写法需要传入设备的主机地址、端口和超时时间:
tn = telnetlib.Telnet(host_address, TELNET_PORT, TELNET_TIMEOUT)
这里的host_address是你要连接的设备IP或域名,需要你补充到代码里。
3. 字节串/字符串的编码问题
telnetlib的读写方法默认操作的是字节串,如果直接传入字符串可能会报错,需要用encode('ascii')把字符串转成字节串,读取到的结果再用decode('ascii')转回字符串。
4. 潜在的日志调用问题
如果这个脚本不是在类的方法里运行,self.logger.ui_debug会因为self未定义报错,你可以替换成print或者标准库的logging模块来输出日志。
修正后的完整代码示例
import time import telnetlib tn_username = "xxxx" tn_password = "xxxxxxx" host_address = "192.168.1.1" # 替换成你的设备实际IP/域名 # Globals: CACHE_DATA = {} SNIPPET_NAME = 'xxxxxx: xxxxxx' FAILED_COUNT = 0 COLLECTION_PROBLEM = False TELNET_PORT = 23 TELNET_TIMEOUT = 2 FAILED_ITEMS = [] # 替换成你的日志输出方式,没有logger的话用print即可 print('************** %s: Starting *******************' % (SNIPPET_NAME)) # start timer start_time = time.time() try: # 正确实例化Telnet连接 tn = telnetlib.Telnet(host_address, TELNET_PORT, TELNET_TIMEOUT) # 处理登录流程,注意字节串的使用 tn.read_until(b"login: ") tn.write(tn_username.encode('ascii') + b"\n") tn.read_until(b"Password: ") tn.write(tn_password.encode('ascii') + b"\n") # 遍历要执行的命令列表 for obj_oid in result_handler.oids: try: # 发送命令,编码为字节串 tn.write(obj_oid.encode('ascii') + b"\r") # 读取返回结果,匹配字节串格式的提示符 rawdata = tn.read_until(b"Welcome to the Tesira Text Protocol Server...", TELNET_TIMEOUT) if rawdata: result_handler[obj_oid] = [(0,"Collection Ok")] CACHE_DATA[obj_oid] = rawdata.decode('ascii').strip() else: FAILED_COUNT += 1 result_handler[obj_oid] = [(0,"Failed: No data found")] FAILED_ITEMS.append(obj_oid) except Exception as e: FAILED_ITEMS.append(obj_oid) result_handler[obj_oid] = [(0,f'Failed: Collection: {obj_oid}, Error: {str(e)}')] FAILED_COUNT +=1 # 保存任务耗时 CACHE_DATA['biamp'] = round(time.time() - start_time,4) # 优雅退出Telnet会话 tn.write(b"bye\r") tn.close() except Exception as e: # 处理外层异常,比如连接失败、登录超时等 print(f"Telnet operation failed: {str(e)}") COLLECTION_PROBLEM = True finally: # 确保即使出错也关闭Telnet连接,避免遗留无效进程 if 'tn' in locals(): tn.close()
额外提示
- 要确保
tn.read_until里的匹配字符串和设备实际输出的提示符完全一致,否则可能会出现超时失败的情况。 - 外层的
finally块可以保证不管是否发生异常,Telnet连接都会被关闭,避免在设备上遗留无效连接进程。
内容的提问来源于stack exchange,提问作者Ian D
相关产品推荐
相关产品推荐

