如何在 openssh 中启用“本地行编辑”,就像 PuTTY 一​​样?

如何在 openssh 中启用“本地行编辑”,就像 PuTTY 一​​样?

我曾经使用 PuTTY 从 Windows 连接到服务器。我发现“本地行编辑”和“本地回显”设置非常有用。它可以防止 PuTTY 将我输入的每个字母发送到服务器,否则当网络延迟严重时,输入完整的命令将变得非常困难。

油灰

但是,当我尝试使用 openssh 从 linux 连接到 vps 时,问题又开始让我感到困惑。我希望只有按下回车键时,该行才会发送到服务器。

openssh 支持本地编辑吗?如何启用它?或者是否有其他命令行 ssh 工具支持此功能?

答案1

运行 sole cat。现在,您的 tty 的行为就如您所愿了:您可以编辑一行,并且仅在或+cat时读取它。这是因为您的 shell 会相应地配置您的本地终端。退出时,shell 会将终端配置回 shell 所需的状态。EnterCtrldcat

交互式ssh(在远程端分配一个 tty)有所不同。shell 仍然像 一样运行cat,但是ssh 本身将终端配置为原始模式。请参阅我的这个问题+答案了解为什么交互式ssh希望本地终端是原始的。

穷人的解决方案是使用管道catssh -tt …在我看来,这有太多缺点,不用管道解决问题更好cat

您希望您的本地终端能够煮熟的使用交互式时ssh。为此,您可以使用stty它来更改本地终端的设置。问题是您需要在ssh将终端配置为原始后执行此操作。如果您在此之前执行此操作,则ssh只会覆盖您的设置。因此,您需要给ssh一些时间并在运行stty时运行。ssh

你可能会想这样做(sleep 10; stty …) & ssh …。这行不通,stty将会收到 SIGTTOU 并且被停止。后台进程无法重新配置其自己的控制终端。最简单的方法是stty在另一个终端中运行(即在另一个控制终端下),并告诉它以第一个终端为目标。

像这样继续:

  1. 在要运行的终端中ssh,调用tty并注意终端是什么设备。输出将类似于/dev/tty3/dev/pts/3

  2. 运行ssh到那里。等待,直到您登录。

  3. 在另一个终端中运行,将 stdin 重定向到第一个终端,并使用将为您提供“本地行编辑”的选项。假设wasstty的输出,基本命令是:tty/dev/pts/3

    </dev/pts/3 stty icanon icrnl opost onlcr echo echoe echok
    

笔记:

  1. Enter仅当您按下或Ctrl+jCtrl+mCtrl+后,本地行才会发送到远程端d。前三个按键中的任何一个都会生成一个终止换行符,该换行符将会得到到远程端。即使你想发送Ctrl+ cCtrl+ zCtrl+ l(清除屏幕)或例如仅q退出远程less,或使用远程 shell 的历史记录,发送它的唯一方法是没有换行符是Ctrl+ d。但是……

  2. 如果你按两次Ctrl+ d(或紧接着按Ctrl+或同等操作),那么你将dEnter导致本地ssh“看到”EOF从原始终端读取时,它永远不会期望(请记住,该工具已将终端配置为原始终端,并认为它仍然是原始终端)。在我的测试中,在ssh“看到”EOF 后停止读取,它实际上变得毫无用处,最终必须被终止(并且必须使用 重置本地终端stty sane)。

    您可以通过向我们的命令中添加内容来禁用Ctrl+的本地功能d(从而使Ctrl+d生成^D可以发送到远程端的内容Enter),但这样一来,您将无法在末尾发送不带换行符的内容。eof ''stty …

  3. 当您向远程 shell 发送一行时,shell 会自动回显该行。这是正常现象。如果要抑制此回显,则需要重新配置远程 tty ( stty -echo)。

  4. opost启用后处理输出。我们需要这个,因为我们明确想要onlcr,没有它,每个远程回声都会出现在意想不到的地方。可能还有其他后处理选项会影响输出,一般来说,您可能希望关闭它们。如果您抑制远程回声(请参阅上一点),那么您就不需要onlcr,您可以禁用输出的本地后处理(-opost)。

  5. 预计本地行编辑会干扰“接管”整个屏幕的交互式远程工具的输出(例如,,,,htop) 。此类工具需要控制终端。作为远程工具,它们可以控制远程 tty,而不是本地tty 。它们对本地 tty 一无所知,因此本地 tty 应该尽可能透明,就像双向 fifo,即处于原始模式。在我们的例子中,它不是处于原始模式,您将看到本地行编辑导致覆盖和滚动,总的来说是一团糟。这本身不会使远程工具感到困惑,但它会让您感到困惑,并且可能会因此发送一些错误的输入。lessvitmux

  6. 我不太确定stty …这个答案中的命令是最好启用“本地行编辑”。阅读man 1 stty、实验并根据您的需要进行调整。

相关内容