我可以告诉SSH仅在按Enter或Tab后才发送数据,而不是在每次单独按键后才发送数据吗?
我可以告诉SSH仅在按Enter或Tab后才发送数据,而不是在每次单独按键后才发送数据吗?
Answers:
否,因为SSH无法知道您键入的内容是否需要输入或制表符才能进行操作-例如,如果您尝试查看命令历史记录,则^R
不会通过以下方式发送或向上箭头自己,那将……令人不快。
不过,您不必在每个字符之间等待它出现在屏幕上;如果您知道自己要键入的内容,请尽快对其进行处理,然后终端机将在您停止键入内容后的大约一个往返时间内赶上来,这与您退出时的状况差不多无论如何,都是行缓冲设置(数据包丢失有所不同,但它引入了它自己有趣的怪癖)。
PuTTY提供了两个可能有用的功能:“本地回显”和“本地行编辑”。本地行编辑会缓冲所有内容,并且仅在行返回后才将其发送到服务器。这可以使命令行更易于处理,但也可以使使用文本编辑器地狱。
PuTTY还具有其他一些选项,用于启用/禁用可能影响感知的连接延迟的某些功能(Nagle的算法)。如我所见,OpenSSH客户端并没有提供PuTTY在这方面的所有功能,而且我不知道Linux替代产品具有可比性。
否则,womble做对了。
使用ssh host.example.org bash
(或您要使用的任何shell)打开ssh会话。
您将获得到远程Shell的行缓冲模式,这意味着您将不会获得提示和行编辑,但会获得本地回显和“一次一行”模式。当使用非常差的连接时,它有时很有用。并非所有程序都能正常运行,因为您没有伪tty,但是大多数UNIX实用程序都能正常工作。
更新:
使用上述技巧时,您可以使用一个名为rlfe的便捷包装程序在本地进行常规的行编辑(readline)。快跑。rlfe ssh host.example.org bash
遇到过同样的问题(由于某些位置的移动数据质量差,导致高延迟和数据包丢失),而且不为我剪短(它需要在所有远程主机上使用特殊程序,在所有服务器上本地和远程修复UTF8而不破坏它们) ,修改所有防火墙-而且它实际上并没有提供本地行编辑)我决定编写一个小的包装程序,为ssh提供本地行编辑模式。
默认情况下,它将按默认的逐个字符模式将所有内容传递给ssh,但是您可以随时按热键进入由读取行支持的本地行编辑模式。因此,您可以在本地输入(包括编辑,命令调用等)整行,然后按Enter时,它将作为一个TCP数据包发送到远程端。
优势是无滞后的命令行编辑(如旧的telnet熟/规范的“逐行缓冲模式”,但具有GNU readline提供的高级编辑命令)。另外,无需在服务器或防火墙上进行任何更改。和默认的逐个字符模式一样,编辑器和其他基于curses的程序可以继续正常工作(尽管有滞后),就像在普通ssh连接中一样。
缺点是您需要每次按热键进入本地线路编辑模式,或者需要修改远程主机上的提示以允许自动检测。另外,远程制表符文件名补全当前只能通过将您放回逐个字符模式(或根据您的喜好使用本地文件系统而不是远程文件系统)来起作用。不过,这项工作仍在进行中,因此欢迎提出要求或提出可行的改进建议!
优点不仅在于您的外壳程序(及其行编辑)是本地的并且没有滞后,而且还可以浏览远程文件系统并将外壳程序文件名补全(Tab键)用于远程文件。另外,(最佳功能IMHO)您可以使用本地选择的编辑器对远程文件进行无延迟的编辑。
缺点是(尤其是如果您的链接也是低带宽的,并且不仅是高延迟),对于每个要编辑的文件,它都必须完全转移到本地主机,然后在编辑后再完全转移到远程。SSHFS确实提供了一些缓存(请参见sshfs(1)选项cache,cache_timeout,cache_x_timeout)以某种程度减轻该问题。另外,如果要在远程上执行某些操作,则需要使用其他屏幕或在所有命令前加上“ ssh remotehost ”(例如ssh remotehost sudo service apache restart
)。请参见ssh_config(5)中的ControlMaster选项,以使执行速度更快(并且无需密码提示)。
如果您只是通过执行命令来运行,则可以模拟这种行为,
ssh user @ targetmachine'我的命令在字符串中'
但,
ssh-agent
或输入密码您可以使用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\'
这就是您想要的。但是,您需要同时安装客户端和服务器,并且OpenSSH上游从未采用这些更改。 https://github.com/hyc/OpenSSH-LINEMODE