両方のプロセスを開始するには?それでは、1回目が完了すると2回目も完了しますか?

両方のプロセスを開始するには?それでは、1回目が完了すると2回目も完了しますか?

ジャンプホストの背後にあるサーバーに対してsshコマンドを使用してスクリプトを実行しています。セキュアネットワーク上のサーバーでコマンドを実行したい場合は、常にsshでジャンプホスト(バスチョン)サーバーに接続して実行し、ncnetcatチャネルを介して実行したい実際のコマンドで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:

waitPIDを使用して次のことを待つことができますが、単にwait $PIDパラメータを使用して2番目のコマンドを実行します。すべての出力はコマンドに引数として渡されるわけではないので、無視する必要があります。したがって、wait引数なしでwaitasを使用できますcommand & wait

process1 & wait $( process2 &> /dev/null )

論理的に変数が解釈される前にprocess1完了するまで待つ必要があります。process2waitprocess2


編集:これは入れ子にすることができます。

sleep 1 & wait $( sleep 2 & wait $( sleep 3 & wait $( sleep 4 ) ) )

4秒間続きますsleep

関連情報