socat 禁用双回声

5 socat

如果我运行一个普通的交互式 python 会话,输入/输出如下所示:

>>> 1 + 1;
2
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试运行它socat,所以我启动了一个“服务器”

socat UNIX-LISTEN:$HOME/socket,fork EXEC:python,pty,stderr
Run Code Online (Sandbox Code Playgroud)

并从另一个终端连接到它:

socat - UNIX-CONNECT:$HOME/socket
Run Code Online (Sandbox Code Playgroud)

除了再次回显输入之外,它几乎可以正常工作:

>>> 1 + 1;
1 + 1;
2
Run Code Online (Sandbox Code Playgroud)

我怎样才能关闭它?echo=0不做我想要的:这在我打字时隐藏了输入,这不是很有帮助。我希望它像普通的交互式会话一样工作。

(使用 python 和本地域套接字只是一个例子;其他程序(例如 cat、lua 等)和其他套接字类型(例如 TCP 套接字)也会发生同样的情况。

把友情*_*在无盐 7

在客户端写这个。注意“原始”

socat unix-connect:socket -,raw,echo=0

或者这在服务器端。注意“echo=0”

socat unix-listen:socket exec:"python",pty,echo=0

但不是两者兼而有之。或者,在服务器 pty 上使用 echo=0 的客户端 stdio 上的 raw 很好,但 echo=0 不得应用两次。


让我们看看两个 1+1 。它们是回声,但具有不同的含义。第一个回声来自客户端的线路缓冲,第二个来自由 socat 创建的服务器端的终端。

>>> 1 + 1;
1 + 1;
2
Run Code Online (Sandbox Code Playgroud)

在客户端 stdio 上单独使用 echo=0 ,socat 通知其控制终端(即 xterm 或类似的)禁用 stdio 缓冲区的回显(屏幕显示),因此第一个 1+1 消失,第二个将显示一旦按下返回键,就在那个地方。服务器 pty 上的 echo=0 防止 socat 将它接收到的输入回显(乒乓)回客户端,因此第二个 1+1 消失了。在客户端使用raw时,stdio 的缓冲被禁用,所以每个键都不会等到返回发送到服务器,服务器立即回显键. 在客户端 stdio 上使用 raw 以及在客户端 stdio 上使用 echo=0 当一个键被按下时,它首先被发送到服务器,然后服务器将它发回并显示在客户端上。在客户端 stdio 上使用 raw 以及在服务器 pty 上使用 echo=0 当一个键被按下时,它会在发送到服务器时同时显示,但永远不会发回。


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