Sshでマシン1に接続してから、sshで別のマシン2に接続しようとしていますが、このエラーが発生します。
ssh [email protected] 'ssh [email protected]'
stdin: is not a tty
どうして?
デフォルトでは、sshを使用してリモートマシンでコマンドを実行すると、リモートセッションに [〜#〜] tty [〜#〜] は割り当てられません。これにより、TTYの癖に対処することなく、バイナリデータなどを転送できます。これは、computerone
で実行されるコマンドに提供される環境です。
ただし、シェルコマンドを実行している可能性が高いため、リモートコマンドなしでsshを実行すると、TTYが割り当てられます。これはssh [email protected]
コマンドで想定されていますが、前の説明のため、そのコマンドで使用できるTTYはありません。
computertwo
でシェルが必要な場合は、代わりにこれを使用してください。これにより、リモート実行中にTTY割り当てが強制されます。
ssh -t [email protected] 'ssh [email protected]'
これは通常、sshチェーンの最後でシェルまたはその他の対話型プロセスを最終的に実行する場合に適しています。データを転送する場合、-t
を追加することは適切でも必要でもありませんが、すべてのsshコマンドには、次のようなデータ生成または消費コマンドが含まれます。
ssh [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'
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
は netcat です。利用可能ないくつかのバージョンのいずれかで十分です。
中間サーバーのttyデバイスにインタラクティブ端末が必要です。
このコマンドを実行すると、機能するはずです。
ssh user@computer1 -t "ssh otheruser@computer2"
見る man ssh
のために -t
オプション。
これを解決するには、〜/ .ssh/configにあるssh構成ファイルにRequestTTY Yesを次のように追加します...
Host myserver.com
User my-ssh-username
RequestTTY Yes
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 -J hostA,hostB hostC
[user@hostC]
試すよりもはるかに簡単です-t
sshコマンドを再実行します。
コマンドラインからSSH構成オプション「RequestTTY」を上書きできます。
私の作業例cd-serv-one.sh
開始/bin/bash
複数のコマンドを実行した後のSSHセッション:
#!/bin/bash
ssh -o "requestTTY=yes" User@ExampleHostName "cd /home/myPathFoo/myPathBar; /bin/bash"
そして今、私は./cd-serv-one.sh
必要なSSHセッションを開始します。