SSH 内部的 SSH 失败,并显示“stdin:不是 tty”

SSH 内部的 SSH 失败,并显示“stdin:不是 tty”

我尝试使用 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 命令简单得多。

相关内容