使用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 消耗资源。