远程 SSH 命令需要终端

远程 SSH 命令需要终端

因此,对于我的一台服务器,我所做的大部分工作是使用 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,例如 、lsps。在这种情况下,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

相关内容