有没有办法避免 SSH 输入延迟?

Sta*_*ked 60 ssh

我可以告诉 SSH 仅在按 Enter 或 Tab 后发送数据,而不是在每次按键后发送数据吗?

wom*_*ble 37

不,因为 SSH 无法知道您输入的内容是否需要按 Enter 键或 Tab 键才能执行操作——例如,如果您尝试查看命令历史记录,则^R不会发送 或向上箭头他们自己,那会……令人不快。

但是,您不必在每个字符之间等待它出现在屏幕上;如果你知道你必须输入什么,尽可能快地敲打它,终端会在你停止打字后的大约一个往返时间内赶上来,这与你离开时一样好无论如何都是行缓冲设置(丢包是不同的,但它引入了它自己有趣的怪癖)。

  • 看看莫什纸。作者做了一些基准测试 https://mosh.org/#techinfo (2认同)

Ste*_*ell 36

Mosh旨在解决这个确切的问题。它设计用于高延迟和不可靠的连接,并提供本地回声和线路编辑。

  • 只是要注意。Mosh 不是 SSH。它使用自己的专有协议。(不过,我对此没有问题。) (4认同)
  • @Alex该协议与一个项目相关,该项目对其具有完全控制权,并且只有一个实现。这就是我所说的“专有”的意思。开放许可固然很好,但直到至少有三个独立但可互操作的实现,并且最好是 IETF RFC ;) 我会这样称呼它。使用 Mosh 不会带来与用非标准替换标准协议相关的常见负担;切换是无缝的,除了使用 UDP(这是一个功能,我们_希望_使用 udp 作为远程终端),所以我不被它打扰。 (2认同)

Jef*_*and 29

PuTTY 提供了两个可能有用的功能:“本地回声”和“本地行编辑”。本地行编辑缓冲所有内容,仅在行返回后将其发送到服务器。这可以使命令行更容易处理,但也可能使使用文本编辑器变得地狱。

PuTTY 还有一些其他选项用于启用/禁用某些可能影响感知连接延迟的事物(Nagle 算法)。在我看来,OpenSSH 客户端并没有提供 PuTTY 在这方面所做的所有功能,而且我不知道可以比较的 Linux 替代方案。

否则,womble 是对的。

  • 这应该是公认的答案 (2认同)

sna*_*nap 12

使用ssh host.example.org bash(或您想使用的任何外壳程序)打开 ssh 会话。

您将获得远程 shell 的行缓冲模式,这意味着您不会获得提示和行编辑,但您将获得本地回显和“一次一行”模式。有时在处理非常糟糕的连接时很有用。并非所有程序都能正常运行,因为您没有伪 tty,但大多数 UNIX 实用程序都可以正常工作。

更新:

使用上述技巧时,您可以使用名为rlfe的便捷包装程序在本地进行正常的行编辑(readline)。就跑。rlfe ssh host.example.org bash

  • 我尝试过,但发现它不太可行。但很高兴知道,谢谢。 (2认同)
  • 什么是“rlfe”? (2认同)
  • @aderchox 尝试输入“ls”,您会发现您实际上已连接。 (2认同)

Mat*_*lis 7

遇到了同样的问题(由于某些位置的移动数据质量不佳而导致高延迟和数据包丢失),并且mosh没有为我剪掉它(它需要在所有远程主机上使用特殊程序,在所有服务器上本地和远程修复 UTF8 而不会破坏它们) ,修改所有防火墙 - 无论如何它并没有真正提供本地行编辑)我决定编写一个小包装器来为 ssh提供本地行编辑模式

默认情况下,它只是在默认的逐字符模式下将所有内容传递给 ssh,但您可以随时按热键进入由 readline 驱动的本地行编辑模式。因此,您可以在本地输入(通过编辑、命令调用等)整行,然后当您按下Enter键时,它将作为一个 TCP 数据包发送到远程端。

优点是无延迟命令行编辑(如旧的 telnet 熟化/规范“逐行缓冲模式”,但具有由GNU readline提供的高级编辑命令)。此外,无需更改服务器或防火墙上的任何内容。编辑器和其他基于 curses 的程序在默认的逐字符模式下继续正常工作(尽管有延迟),就像在正常的 ssh 连接中一样。

缺点是你要么每次需要按热键进入本地线路编辑模式,要么你需要修改远程主机上的提示以允许自动检测。此外,远程选项卡文件名完成目前只能通过将您返回到逐个字符模式(或使用本地文件系统而不是远程文件系统,具体取决于您的偏好)来工作。不过,它正在进行中,因此欢迎提出请求或可行的改进想法!


在非常规方面,您也可以使用SSHFS在本地挂载远程文件系统。

优点不仅在于您的 shell(及其行编辑)是本地的且无延迟,而且您可以导航远程文件系统并对远程文件使用 shell 文件名补全(tab 键)。此外,(恕我直言,最佳功能)您可以使用您选择的本地编辑器进行远程文件的无延迟编辑。

缺点是(特别是如果你的链接也是低带宽的,不仅是高延迟),每个要编辑的文件,都需要完全传输到localhost,然后编辑完再完全传输到remote。SSHFS 确实提供了一些缓存(请参阅 sshfs(1) 选项cachecache_timeoutcache_x_timeout)以在一定程度上缓解该问题。此外,如果您想在远程执行某些操作,您需要使用另一个屏幕或在所有命令前加上“ ssh remotehost ”(例如ssh remotehost sudo service apache restart)。见选项ControlMasterssh_config中(5) ,使更快执行(和无密码提示)。