如果我运行普通的交互式 python 会话,输入/输出如下所示:
>>> 1 + 1;
2
现在我试图运行它socat
,所以我启动了一个“服务器”
socat UNIX-LISTEN:$HOME/socket,fork EXEC:python,pty,stderr
并从另一个终端连接到它:
socat - UNIX-CONNECT:$HOME/socket
除了输入再次回显之外,它几乎可以正常工作:
>>> 1 + 1;
1 + 1;
2
我怎样才能关闭它?echo=0
没有做我想要的事情:这会在我打字时隐藏输入,这不是很有帮助。我希望它像正常的交互式会话一样工作。
(使用 python 和本地域套接字只是一个示例;其他程序(例如 cat、lua 等)和其他套接字类型(例如 TCP 套接字)也会发生同样的情况。
答案1
在客户端写这个。注意“生的”。
socat unix-connect:socket -,raw,echo=0
或者这个服务器端。注意“echo=0”
socat unix-listen:socket exec:"python",pty,echo=0
但不能两者兼而有之。或者,在客户端 stdio 上使用 raw,在服务器 pty 上使用 echo=0 也可以,但 echo=0 不得应用两次。
让我们看看两个1+1。它们是回声,但含义不同。第一个回显来自客户端的行缓冲,第二个回显来自 socat 创建的服务器端终端。
>>> 1 + 1;
1 + 1;
2
在客户端 stdio 上单独使用 echo=0 ,socat 通知其控制终端(即 xterm 或类似的终端)禁用 stdio 缓冲区的回显(屏幕显示),因此第一个 1+1 消失,第二个将显示就在按下返回键的地方。服务器 pty 上的 echo=0 会阻止 socat 将其接收到的输入回显(乒乓)回客户端,因此第二个 1+1 消失。和生的在客户端上,stdio 的缓冲被禁用,因此每个密钥都不会等到返回被发送到服务器,并且服务器会立即回显该密钥。在客户端 stdio 上使用 raw 并在客户端 stdio 上使用 echo=0 当按下按键时,它首先发送到服务器,然后服务器将其发送回并显示在客户端上。在客户端 stdio 上使用 raw 并在服务器 pty 上使用 echo=0 当按下某个键时,它会在发送到服务器时同时显示,但永远不会发回。
对于命令行编辑,有时在客户端缓冲一行就足够了,并且在我们完成编辑该行之前不发送整行。然而,如果需要强大的智能完成功能,服务器端的参与是必要的。