我尝试使用 ssh 连接到一台机器,然后使用 ssh 连接到另一台机器二,但出现此错误。
ssh [email protected] 'ssh [email protected]'
stdin: is not a tty
为什么?
答案1
默认情况下,当您使用 ssh 在远程计算机上运行命令时,电传打字机未分配给远程会话。这使您可以传输二进制数据等,而无需处理 TTY 怪癖。这是为在 上执行的命令提供的环境computerone
。
但是,当您运行没有远程命令的 ssh 时,它会分配一个 TTY,因为您可能正在运行 shell 会话。这是命令所期望的,但由于前面的解释,该命令没有可用的 TTY。ssh [email protected]
如果你想在 上使用 shell computertwo
,请使用它,这将在远程执行期间强制 TTY 分配:
ssh -t [email protected] 'ssh [email protected]'
当您最终在 ssh 链末尾运行 shell 或其他交互式进程时,这通常是合适的。如果要传输数据,则添加 既不合适也不需要-t
,但每个 ssh 命令都会包含一个数据生成或消耗命令,例如:
ssh [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'
答案2
有一个更好的方法来使用 SSH 作为中继:使用该ProxyCommand
选项。您需要在客户端计算机上拥有一个密钥,以便您登录第二台计算机(无论如何,公钥是大多数情况下使用 SSH 的推荐方式)。将其放入您的~/.ssh/config
并运行ssh computertwo
。
Host computerone
HostName computerone.com
User user
Host computertwo
HostName computertwo.com
User otheruser
ProxyCommand ssh computerone exec nc %h %p
nc
是网猫。任何可用的版本都可以。
答案3
它期望中间服务器上的 tty 设备上有一个交互式终端。
如果你尝试这个命令,它应该可以工作:
ssh user@computer1 -t "ssh otheruser@computer2"
请参阅参考资料man ssh
中的-t
选项。
答案4
您可以在 ssh 中使用 PROXY Jump 选项
-J [user@]host[:port]
Connect to the target host by first making a ssh connection to the jump host and then establishing a TCP forwarding to the ultimate destination from there. Multiple jump hops may be specified
separated by comma characters. This is a shortcut to specify a ProxyJump configuration directive.
因此,如果我需要连接到主机 B,但我必须先通过主机 A 才能到达那里。通常我会
ssh hostA
[user@hostA ~]$ ssh hostB
我现在这样做
ssh -J hostA hostB
[user@hostB ~]$
您甚至可以,
分离多个主机
ssh -J hostA,hostB hostC
[user@hostC]
-t
比尝试再次运行 ssh 命令简单得多。