You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:56:28