远程 SSH 命令需要终端

Ray*_*mad 6 ssh vim remote-access

因此,对于我的其中一台服务器,我所做的大部分工作是使用 vim 编辑文件。有可能做类似的事情ssh me@myserver vim吗?当我尝试这样做时,我收到“警告,输出不是终端”,并且 vim 无法使用。

我阅读了 ssh 联机帮助页,但是 bash 不喜欢使用转义字符 ~C 来创建命令终端。

Ant*_*gan 9

理论

SSH 会话可以在有或没有远程服务器分配伪终端(PTY) 设备的情况下启动。

通常,当您通过 SSH(不指定命令)连接到远程主机时,您会在正确验证后运行默认登录 shell。在远程主机上运行此 shell 时,会自动为交互式 shell 分配一个伪终端。这允许 shell 写入用户的屏幕,以便它可以执行诸如显示其提示之类的操作。

在交互会话期间,SSH_TTY环境变量被设置为远程PTY设备的设备节点,例如,/dev/pts/10当伪终端退出时,ssh打印以下消息:

Connection to <remotehost> closed.
Run Code Online (Sandbox Code Playgroud)

对于非交互式SSH 会话,即指定要在远程主机上运行的命令,不分配伪终端并将命令输出发送到stdout本地终端的 。在运行仅从stdinstdout/或打印输入和/或的命令时,此默认行为运行良好stderr,例如lsps, 等。在这种情况下,SSH_TTY环境变量未设置,我还注意到TERM环境变量设置为dumb。不带伪终端操作时,~C不支持诸如之类的转义字符;这使得程序可以安全地传输可能包含这些序列的二进制文件。

但是,诸如vimtop需要能够使用各种终端功能(通常使用ncurses库)重绘屏幕的程序。为此,他们需要一个终端设备——或者一个模拟终端的设备。该ssh客户端有-t这迫使一个伪终端的分配选项。此-t选项在 SSH 手册页中描述:

强制伪 tty 分配。这可用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制 tty 分配,即使 ssh 没有本地 tty。

结论

因此,-t只需将选项添加到 SSH 命令即可为 Vim 提供一个可以使用的终端设备:

ssh -t me@myserver vim
Run Code Online (Sandbox Code Playgroud)