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

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

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

答案1

不,因为 SSH 无法知道您输入的内容是否需要按回车键或制表键才能执行——例如,如果您尝试浏览命令历史记录,则^R向上箭头或向下箭头不会自行发送,那将是……令人不快的。

不过,您不必等待每个字符出现在屏幕上;如果您知道要输入什么,请尽可能快地输入,终端将在您停止输入后的大约一个往返时间内赶上,这与您从行缓冲设置中获得的效果差不多(数据包丢失有所不同,但它会引入其自己的有趣怪癖)。

答案2

莫什就是为了解决这一问题而设计的。它专为高延迟和不可靠的连接而设计,并提供本地回显和行编辑功能。

答案3

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

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

否则,womble 就说对了。

答案4

遇到同样的问题(由于移动数据质量差,延迟和数据包丢失率高在某些地方),以及莫什对我来说还不够(它需要在所有远程主机上运行特殊程序,在不破坏所有服务器的情况下,在本地和远程修复 UTF8,修改所有防火墙 - 而且它实际上并不提供本地行编辑功能)我决定编写一个小包装器来提供ssh 的本地行编辑模式

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

优点是无滞后的命令行编辑(如旧的 telnet 熟/规范的“逐行缓冲模式”,但具有由GNU readline)。此外,服务器或防火墙上无需进行任何更改。编辑器和其他基于 curses 的程序继续在默认的逐字符模式下正常工作(尽管有延迟),就像在正常的 ssh 连接中一样。而且(因为它只是围绕您的系统 ssh 客户端)不存在不跟上 ssh 安全修复的危险。

缺点是每次需要时您都需要按热键进入本地行编辑模式,或者需要修改远程主机上的提示以允许自动检测。此外,远程标签文件名补全目前只能通过让您返回到逐字符模式(或使用本地文件系统而不是远程文件系统,具体取决于您的偏好)来实现。不过,这项工作仍在进行中,因此欢迎提出请求或可行的改进想法!


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

这样做的好处不仅在于您的 shell(及其行编辑)是本地的并且无延迟,而且您还可以导航远程文件系统并使用 shell 文件名完成(Tab 键) 来编辑远程文件。此外,(在我看来,这是最好的功能)您可以使用您选择的本地编辑器来无延迟地编辑远程文件。

缺点是(特别是如果你的链接也是低带宽的,而且不仅仅是高延迟),对于每个要编辑的文件,它都需要完全传输到本地主机,然后在编辑后,再次完全传输到远程主机。SSHFS 确实提供了一些缓存(请参阅 sshfs(1) 选项缓存缓存超时cache_x_timeout)来缓解这些问题。此外,如果您想在远程执行某些操作,则需要使用另一个屏幕或在所有命令前加上“ssh 远程主机“(例如ssh remotehost sudo service apache restart)。请参阅选项控制大师ssh_配置(5)使其执行速度更快(并且无需密码提示)。

相关内容