socat 禁用双回显

socat 禁用双回显

如果我运行普通的交互式 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 当按下某个键时,它会在发送到服务器时同时显示,但永远不会发回。


对于命令行编辑,有时在客户端缓冲一行就足够了,并且在我们完成编辑该行之前不发送整行。然而,如果需要强大的智能完成功能,服务器端的参与是必要的。

相关内容