私が達成したいのは、ジャンプサーバーの背後にある2つのサーバーでSSH接続をテストすることです。要件は、実際にシェルをロード(プロンプト)してからサーバーをシャットダウン(接続)することです。最初は次のことを試しました。
ssh -A -t [email protected] \
"command1; ssh user1@server1 exit; ssh user2@server2 exit"
プロンプト(シェル)をロードする前に、SSH接続を接続してすぐに終了します。解決策が見つかりました。
ssh -A -t [email protected] \
"command1; ssh user1@server1 <<EOF
EOF
ssh user2@server2 <<EOF
EOF
"
EOFを使用すると、実際にはいくつかのコマンドが必要なのでプロンプトを待ち、プロンプトがないので終了します。
私の目標を達成するためのより良い/より良い方法はありますか?
答え1
という代替手段があります.ssh/config
.ssh/config というファイルを作成し、次のように編集します。
Host Server-Jump-*
User username
IdentityFile ~/.ssh/id_rsa # -- if you want to provide key
ForwardAgent yes
ServerAliveInterval 60
ServerAliveCountMax 12
Host Server1
Hostname 21.19.6.19
Port 2222
Host Server2
Hostname Server2-IP
Port 22
ProxyCommand ssh -W %h:%p Server1
このファイルを保存してください。
それでは、次のコマンドを試してください。
ssh Server2
プロキシコマンド部分の説明
-W host:port
Requests that standard input and output on the client be forwarded to host on port over the secure channel. Implies -N, -T, ExitOnForwardFailure and ClearAllForwardings. Works
with Protocol version 2 only.
`%h` Host name to connect
`%p` Port name to connect
答え2
複数のコンピュータでより多くの人が使用するので、設定ファイルを使用したくないので(変更するたびにすべてを更新したくない)、次の解決策を考えました。
ssh -A -t user@server1 \
"command1
echo -e "command2" | ssh user1@server2
echo -e "command3" | ssh user2@server3"
これは私に必要な正確な出力を良い形式で提供します。
答え3
明らかに、これは完全自動接続終了プロセスなので、標準入力は必要ありません。では、標準入力を閉じたらどうでしょうか?
<&- ssh -A -t [email protected] "
command1
ssh user1@server1
ssh user2@server2
"
command1
stdinが閉じて奇妙なエラーが発生した場合は、<&-
交換できます。< /dev/null