Answers:
默认情况下,当您使用ssh在远程计算机上运行命令时,不会为远程会话分配TTY。这使您可以传输二进制数据等,而不必处理TTY怪癖。这是为在上执行的命令提供的环境computerone
。
但是,当您在没有远程命令的情况下运行ssh时,它确实会分配TTY,因为您可能正在运行Shell会话。该ssh otheruser@computertwo.com
命令是预期的,但是由于前面的解释,该命令没有可用的TTY。
如果要使用shell computertwo
,请改用它,这将在远程执行期间强制分配TTY:
ssh -t user@computerone.com 'ssh otheruser@computertwo.com'
当您最终在ssh链的末尾运行shell或其他交互式进程时,通常这是适当的。如果要传输数据,既不适当也不要求add -t
,但是每个ssh命令都将包含一个产生数据或消耗数据的命令,例如:
ssh user@computerone.com 'ssh otheruser@computertwo.com "cat /boot/vmlinuz"'
有一种更好的方式将SSH用作中继:使用该ProxyCommand
选项。您需要在客户端计算机上具有一个密钥,该密钥可以让您登录第二台计算机(无论如何,在大多数情况下,公钥是推荐的使用SSH的方式)。将此放入您的设备~/.ssh/config
并运行ssh computertwo
。
Host computerone
HostName computerone.com
UserName user
Host computertwo
HostName computertwo.com
UserName otheruser
ProxyCommand ssh computerone exec nc %h %p
nc
是网猫。任何可用的几个版本都可以。
您可以在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.
因此,如果我需要连接到hostB,但必须先通过hostA才能到达那里。通常我会
ssh hostA
[user@hostA ~]$ ssh hostB
我现在这样做
ssh -J hostA hostB
[user@hostB ~]$
ssh
!