Python在通过Telnet会话时报告“行末无效语法”。

3

当通过telnet会话打开Python解释器时,每个发送的命令都会被拒绝并显示"SyntaxError: invalid syntax"。 如何成功地通过telnet会话发送命令?

示例: 启动一个服务器,以交互模式提供Python解释器:

socat TCP-LISTEN:5092 EXEC:'python -i' 

使用Telnet连接并从Telnet会话发送命令:

>telnet localhost 5092
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
print "test"

在服务器端产生以下结果:

>socat TCP-LISTEN:5092 EXEC:'python -i' 
Python 2.7.5 (default, Aug 25 2013, 00:04:04) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>   File "<stdin>", line 1
    print "test"
                ^
SyntaxError: invalid syntax
>>> 

我在Mac OS X 10.9.2中使用两个不同的终端窗口来运行所有这些内容,Python版本是2.7.5。
我发现一个类似问题的描述在这里,然而设置PYTHONUNBUFFERED=NO并没有解决问题。
此外,当直接与python解释器交互时(即不通过telnet),不会出现这种错误。
我的怀疑是这与telnet发送行结尾的方式有关。尝试在telnet会话中切换“切换crlf”,从<CR><NUL>切换到<CR><LF>以进行回车键操作,但仍然没有帮助。
非常感谢您提供任何帮助/想法/思路!
问候, 卡尔斯滕
1个回答

2
我自己找到了原因,所以对于未来的搜索者:
telnet在键入并使用发送每个命令后会自动添加CR。然而,python解释器不将CR (\r) 视为命令的一部分,并在该字符上报告语法错误 (\r是不可打印的,因此可能在由Python生成的错误消息中看不见)。 参见这里:https://discussions.apple.com/thread/855998 对我来说,解决方案是使用不同于telnet的工具进行通信:在这种情况下是使用netcat。
nc -v localhost 5092 

打开一个类似于telnet的会话,其中命令不会自动添加CR。它有效!


是的,这听起来像是telnet协议(它不是直接的tcp)、终端层和系统换行符表示之间的冲突。Python使用\n换行符,遵循POSIX约定,但telnet发送\r\0。通常终端层telnetd处理此问题(比较stty),但您连接到的是socat,它不进行转换。其他可能的解决方法是将Python的sys.stdin设置为通用模式,并在telnet中使用crlf模式,或者只是使用socat或netcat而不是telnet。 - Yann Vernier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接