因此,对于我的一台服务器,我所做的大部分工作是使用 vim 编辑文件。是否可以执行类似这样的操作ssh me@myserver vim
?当我尝试执行此操作时,我收到“警告,输出未发送到终端”,并且 vim 无法使用。
我阅读了 ssh 手册页,但是 bash 不喜欢使用转义字符 ~C 来创建命令终端。
答案1
理论
SSH 会话可以在远程服务器分配一个伪终端(PTY)设备。
通常,当您通过 SSH 连接到远程主机(不指定命令)时,您会在正确验证身份后运行默认登录 shell。在远程主机上运行此 shell 时,会自动为交互式 shell 分配一个伪终端。这允许 shell 写入用户的屏幕,以便它可以执行诸如显示其提示符之类的操作。
在交互式会话期间,SSH_TTY
环境变量被设置为远程PTY设备的设备节点,例如,/dev/pts/10
当伪终端退出时,ssh
打印以下消息:
Connection to <remotehost> closed.
为了非交互式SSH 会话,即指定要在远程主机上运行的命令,不分配伪终端,命令输出将发送到stdout
本地终端。此默认行为在运行仅从 读取输入stdin
并打印到stdout
和/或 的命令时效果很好stderr
,例如 、ls
等ps
。在这种情况下,SSH_TTY
环境变量未设置,我还注意到TERM
环境变量设置为dumb
。在没有伪终端的情况下操作时,~C
不支持转义字符,例如;这使得程序可以安全地传输可能包含这些序列的二进制文件。
但是,诸如vim
或 之类的程序top
需要能够使用各种终端功能(通常使用库ncurses
)重新绘制屏幕。为此,它们需要终端设备 - 或模拟终端的设备。ssh
客户端具有-t
强制分配伪终端的选项。此-t
选项在 SSH 手册页中描述:
强制分配伪 tty。这可用于在远程计算机上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制分配 tty,即使 ssh 没有本地 tty。
结论
因此,-t
只需将该选项添加到您的 SSH 命令中即可为 Vim 提供可以使用的终端设备:
ssh -t me@myserver vim