質問

私の場合私はSSH 'サーバーにsshされる前にopenvpnを実行し、openvpnコマンドは "初期化シーケンスが完了"。

SO、スクリプトはopenvpnをセットアップしてからSSHを設定します。

私の質問は、バックグラウンドでBashでコマンドを実行し、別のプログラムを実行する前にエコー "完了"まで待っていますか?

私の現在の方法これは2つの端末ペインを開くことで、1つの走行:

sudo openvpn --config FILE
.

と他方の実行:

ssh SERVER
.

最初の端末ペインに「初期化シーケンスは完了」テキストを示しています。

役に立ちましたか?

解決

前景の標準的な処理でOpenVPNを実行するように見えます。< / P>

exec 3< <(sudo openvpn --config FILE)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
# VPN initialization is now complete and running in the background
ssh SERVER
.

説明

ピースに分割しましょう:

  1. echo <(sudo openvpn --config FILE)/dev/fd63のようなものを印刷します
    • <(..)は、バックグラウンドで openvpn を実行し、...
    • echo
    • でプリントアウトされているファイル記述子にその標準を添付します。
  2. exec 3< /dev/fd63.
    • / dev / fd63 はステップ1から印刷されたファイル記述子です)
    • これは、読み取りのためにファイル記述子( / dev / fd63 )を開くようにシェルに伝えます...
    • ファイル記述子3
    • で利用できるようにします。
  3. sed '/Initialization Sequence Completed$/q' <&3.
    • 今度は、 sed を前景に実行しますが、ファイル記述子3から読み取ってください。
    • sed とすぐに、現在の行が「初期化シーケンスが完了した」で終了すると、( / Q 部分)
  4. cat <&3 &.
    • openvpn はファイル記述子に書き込まれ、最終的にはそれから読み取られない場合はブロックします
    • それを防ぐために、バックグラウンドで cat を実行して出力
    • を読みます。
  5. 基本的なアイデアはバックグラウンドで3を実行することですが、マジックワードを読み込むまでブロックする前景でコマンドを実行できるように、その出力をどこかにキャプチャすることです。上記のコードは、Messy一時ファイルを作成せずにそれを実行しようとしますが、一時ファイルを使用するだけではより簡単な方法があります。

他のヒント

Grepの-m 1と一緒に--line-bufferedを使用して、連続ストリームで最初の一致後にgrepを終了します。これは機能するはずです:

sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top