什么时候 ssh -t 不适合代替 ssh?

什么时候 ssh -t 不适合代替 ssh?

使用ssh -t而不是ssh来连接远程服务器有几个优点。例如,我可以直接使用 vim: 来编辑文件ssh -t host vim foo.txt,否则会失败。

在什么情况下使用 ssh 时分配 (伪)-tty 是一件坏事?

答案1

当管道输入或取回输入时,这是“ssh host command”的典型用法。控制字符可以由 TTY 层解释(例如 ^S)。

答案2

是的,有时您想建立静默的后台连接,例如在设置隧道时(例如 SOCKS 代理)。在这样的例子中,您希望进程没有 tty。

这是设置从本地主机到某个远程主机的端口转发的示例...

ssh -l username -fNTL 8073:server:873

设置完成后,您就可以 rsync 到本地主机,而不是远程主机,从而有效地通过隧道传输您的 rsync ssh...

rsync --port=8073 -a me@localhost::myStuff /tmp/myStuff/

server如果 rsync 发出的请求被阻止,但ssh事实并非如此,您会这样做。

答案3

除了上述内容之外...

(1)不同的 tilda 转义处理:

如果您有 pty (-t),则“~.”转义符将断开您的连接。对于长时间运行的命令,您可能希望防止有人在输入 ~ 时意外停止进程。

$ ssh hostname.tomontime.com -t sleep 60
[输入 ~. 并且它会断开连接]
与 hostname.tomontime.com 的连接已关闭。

$ ssh hostname -T sleep 60
[我输入 ~. 并且它将其视为正常击键,sleep 命令会忽略它。]
~.
~.

尝试使用 CTRL-C 执行相同的操作。您会发现使用 -t 可以将 CTRL-C 发送到“睡眠”。使用 -T 可以将 CTRL-C 发送到计算机上运行的 ssh 程序。有时这可能会产生不同(即程序处理 INT 的方式与 HUP 不同)

(2)您只是想最小化 pty 或网络连接活动。

当尝试重启一台 pty 用完的机器时,您不会希望系统尝试分配 pty!这还可以最大程度地减少必须关闭的网络连接(延迟重启)。

这将工作得更快、更可靠:
ssh -T hostname reboot

这样可能会有问题:
ssh -t hostname reboot

答案4

ssh -t 在远程机器上创建一个伪终端。如果您通过多个服务器链接 ssh 命令并希望在远端有一个真正的终端(例如,您可以使用“vi”),这将非常有用。

如果存在终端,登录脚本的行为会有所不同,您可能不需要“-t”。在我看来,这是不好的做法,但我见过登录脚本在 1) 设置提示符和 2) 扩展许多交互式应用程序的路径之前检查 TTY 的情况。

在另一个例子中(上文 TomOnTime 提到),我实际上遇到过所有 TTY(ptys)都用完的情况。显然是配置错误,但没有必要为一堆隧道和 rsyncs 消耗资源。

相关内容