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


43

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


我对您有这样的打字延迟而无法使用的地方非常感兴趣。我在现代时代使用ssh,从未遇到过这些问题。
mailq

4
我正在从比利时访问SliceHost VPS(美国)。明显的延迟使我感到困惑。但是,我注意到其他人似乎对此不那么感到困扰
。– StackedCrooked


@mailq你不是在2019年使用3G吗?从乡村乡间别墅或地下
小巷晃动

Answers:


32

否,因为SSH无法知道您键入的内容是否需要输入或制表符才能进行操作-例如,如果您尝试查看命令历史记录,则^R不会通过以下方式发送或向上箭头自己,那将……令人不快。

不过,您不必在每个字符之间等待它出现在屏幕上;如果您知道自己要键入的内容,请尽快对其进行处理,然后终端机将在您停止键入内容后的大约一个往返时间内赶上来,这与您退出时的状况差不多无论如何,都是行缓冲设置(数据包丢失有所不同,但它引入了它自己有趣的怪癖)。


我真的很想找到一种基准测试多台机器的ssh输入速度的方法。我观察到,速度可以使位于同一位置的机器之间的LOT发生变化,并且这些机器上没有任何重负荷。我的理论是,这种情况尤其在AWS的小型实例(例如微型实例或小型实例)中发生。
索林

1
看莫什纸。作者进行了一些基准测试mosh.org/#techinfo
user7610

25

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

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

否则,womble做对了。


这应该是公认的答案
Freddie Fabregas

我无法在macOS上安装PuTTY,有替代品吗?
航空风行者

Linux上的腻子有点痛苦。它无法自动重新连接,在断开连接时显示一些消息框,我需要再次打开窗口。我希望我可以在Linux上使用kitty或plink.exe之类的东西,或者更好地以某种方式调整autossh。有些设备不支持(如果我尝试访问我的家用openwrt路由器)
POMATu

21

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


您可以在没有sudo的情况下从源代码将其安装在本地目录中。另外,请访问mosh.org。它说:“没有特权代码。没有守护程序。您不需要成为超级用户来安装或运行Mosh。客户端和服务器是由普通用户运行的可执行文件,并且仅在连接期间有效。”
史蒂文·霍维尔

1
只是要注意。Mosh不是SSH。它使用自己的专有协议。(不过,我对此没有问题。)
user7610

这从头开始为我在android和家庭不良wifi网络上工作。它知道readline
tinmarino

9

使用ssh host.example.org bash(或您要使用的任何shell)打开ssh会话。

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

更新:

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


1
我尝试过,但觉得不太可行。但知道这很酷,谢谢。
StackedCrooked

这对我来说很棒。
lakesare 2015年

6

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

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

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

缺点是您需要每次按热键进入本地线路编辑模式,或者需要修改远程主机上的提示以允许自动检测。另外,远程制表符文件名补全当前只能通过将您放回逐个字符模式(或根据您的喜好使用本地文件系统而不是远程文件系统)来起作用。不过,这项工作仍在进行中,因此欢迎提出要求或提出可行的改进建议!


在非常规方面,您可以选择使用SSHFS在本地安装远程文件系统。

优点不仅在于您的外壳程序(及其行编辑)是本地的并且没有滞后,而且还可以浏览远程文件系统并将外壳程序文件名补全(Tab键)用于远程文件。另外,(最佳功能IMHO)您可以使用本地选择的编辑器对远程文件进行无延迟的编辑。

缺点是(尤其是如果您的链接也是低带宽的,并且不仅是高延迟),对于每个要编辑的文件,它都必须完全转移到本地主机,然后在编辑后再完全转移到远程。SSHFS确实提供了一些缓存(请参见sshfs(1)选项cachecache_timeoutcache_x_timeout)以某种程度减轻该问题。另外,如果要在远程上执行某些操作,则需要使用其他屏幕或在所有命令前加上“ ssh remotehost ”(例如ssh remotehost sudo service apache restart)。请参见ssh_config(5)中的ControlMaster选项,以使执行速度更快(并且无需密码提示)。


3

如果您只是通过执行命令来运行,则可以模拟这种行为,

ssh user @ targetmachine'我的命令在字符串中'

但,

  1. 这增加了创建连接的额外延迟(可以使用master / shared ssh连接来缓解)
  2. 如果您没有无密码的私钥,则必须使用ssh-agent或输入密码
  3. 显然,如果您正在与菜单进行交互或编辑文件等,此操作将无效。

1

您可以使用tmux实现键入的流畅回声。在本地运行tmux。如果在一个窗格中有ssh shell,而在其下面的窗格中有ssh shell,则可以从本地窗格将密钥发送到远程窗格。

tmux send-keys -t top 'ls' C-m

我直接在滞后ssh shell中键入交互式命令和小命令。一旦滞后开始阻碍我的打字,我便切换到本地窗格并使用发送键。即使在键入命令的过程中,此方法也有效。

为了简化它,我将其添加到我的.bashrc中

function ts {
    args=$@
    tmux send-keys -t right "$args" C-m
}

感谢Christian Pelczarski解释发送密钥:https ://minimul.com/increased-developer-productivity-with-tmux-part-5.html

例如,使用引号时必须转义

ts git config --global alias.lola \'log --graph --decorate --pretty=oneline --abbrev-commit --all\'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.