SSH 内部 SSH が "stdin: not a tty" のため失敗します。

SSH 内部 SSH が "stdin: not a tty" のため失敗します。

SSHを使用して1台のコンピュータに接続し、SSHを使用して他の2台のコンピュータに接続しようとしましたが、このエラーが発生します。

ssh [email protected] 'ssh [email protected]'

stdin: is not a tty

なぜ?

答え1

デフォルトでは、SSHを使用してリモートシステムでコマンドを実行すると、テレタイププライターリモートセッションに割り当てられていません。これにより、TTY問題を処理することなくバイナリデータなどを転送できます。で実行されるコマンドに提供される環境ですcomputerone

ただし、リモートコマンドなしでsshを実行すると、おそらくシェルセッションが実行されているため、TTYが割り当てられます。これはコマンドで予想されるものですが、前の説明のためにコマンドに使用できるTTYはありません。ssh [email protected]

top でシェルを使用するには、computertwo次のようにします。これにより、リモート実行中にTTY割り当てが強制されます。

ssh -t [email protected] 'ssh [email protected]'

これは通常、SSH チェーンの最後でシェルまたは他の対話型プロセスを実行する場合に適しています。データを転送する場合、追加は適切でも必須ではありませんが、-tすべてのsshコマンドにはデータ生成または消費コマンドが含まれます。たとえば、次のようになります。

ssh [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'

答え2

SSHをリレーとして使用するより良い方法があります。このProxyCommandオプションを使用してください。 2番目のコンピュータにログインするには、クライアントコンピュータにキーが必要です。とにかく公開鍵は、ほとんどの場合、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]

-tsshコマンドを再実行するよりもはるかに簡単です。

関連情報