ジャンプホストの背後にあるサーバーに対してsshコマンドを使用してスクリプトを実行しています。セキュアネットワーク上のサーバーでコマンドを実行したい場合は、常にsshでジャンプホスト(バスチョン)サーバーに接続して実行し、nc
netcatチャネルを介して実行したい実際のコマンドでsshを実行する必要があります。その後、原稿を停止する必要がありますnc
。
私は同時に2つのプロセスを実行し、nc
ピギーバックプロセスが完了したらSSHプロセスを閉じることができる「スマートアンパサンド」が欲しいです。
これが私が現在やっていることです。
ssh -g -L 23:localhost:22 -f -N user@jumphost &
ssh user2@localhost -P 23 "ssh user@destination server \"ls -al\""
kill -0 $!
問題は、それが原子的ではないということです。スクリプトにエラーがある場合は完了せず、nc
元のプロセスは終了しません。
私の質問は次のとおりです両方のプロセスを開始するには?それでは、1回目が完了すると2回目も完了しますか?
答え1
あなたの質問に対する答えではありませんが、この答えは数あなたの問題を解決するために、次のことをしたいと思います。
ProxyCommand
アプリで使用すると、~/.ssh/config
次のすべてのことが行われます。
Host server
HostName server.tld
User {server user}
Host proxy
ProxyCommand ssh server -W %h:%p
User {proxy user}
その後、次のコマンドを使用してサーバーに簡単にアクセスできます。ssh server
答え2
私があなたの命令を正しく解釈したら、これと同じではないでしょうか?
ssh -t user@jumphost ssh user@destination ...
あなた-L
がやっていることは、ポートをジャンプホストのSSHサーバーに転送することです。しかし、すでにそのサーバーに接続していますが、追加のトンネルが必要なのはなぜですか?
この場合、jumphostは接続する2番目のSSHクライアントでもあります。ジャンプホストをクライアントとして信頼できない場合(つまり、ジャンプホストに暗号化されたデータのみを表示させる場合)、信頼しないでください。そうでは-L 23:destination:22
ありませんかlocalhost
?
答え3
回避策の使用wait
:
wait
PIDを使用して次のことを待つことができますが、単にwait $PID
パラメータを使用して2番目のコマンドを実行します。すべての出力はコマンドに引数として渡されるわけではないので、無視する必要があります。したがって、wait
引数なしでwait
asを使用できますcommand & wait
。
process1 & wait $( process2 &> /dev/null )
論理的に変数が解釈される前にprocess1
完了するまで待つ必要があります。process2
wait
process2
編集:これは入れ子にすることができます。
sleep 1 & wait $( sleep 2 & wait $( sleep 3 & wait $( sleep 4 ) ) )
4秒間続きますsleep
。