bash スクリプト openvpn、出力を待機、ssh サーバー、openvpn の終了

bash スクリプト openvpn、出力を待機、ssh サーバー、openvpn の終了

bash スクリプトを使用して openvpn 接続を開始し、トンネルが確立されたらサーバーへの SSH ターミナル接続を開始し、SSH 接続を閉じたら openvpn 接続も閉じます。

まず、提案された解決策を実装してみました。https://stackoverflow.com/questions/21001220/bash-sequence-wait-for-output-then-start-next-programシェルスクリプトとして

#!/bin/bash
exec 3< <(sudo openvpn --config  /etc/openvpn/server.ovpn)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
ssh server

このスクリプトを fish シェルで sh ssh-vpn.sh として実行します。

スクリプトとして実行すると、構文エラーが発生しますline 2: syntax error near unexpected token '<'。スクリプトの外部では、このエラーは発生しません。

また、これらのコマンドをスクリプトとして使用していない場合、ファイル記述子 3 がすでに存在しているためにエラー メッセージが表示されることがありました。

  1. スクリプトの構文エラーを回避するにはどうすればよいですか?

  2. その後、openvpn 接続を自動的に閉じるようにスクリプトを拡張するにはどうすればよいですか?

  3. スクリプトの終了時にファイル記述子が閉じられるようにするにはどうすればよいですか?

1 つの質問としては多すぎる場合は申し訳ありません。これは私にとって久しぶりのスクリプトに関する質問の 1 つであり、まだ学ぶべきことがたくさんあります。

答え1

問題は、コードがbashシェル用に書かれているのに、それを実行するために明示的に を使用していることですsh。ますます多くのプラットフォームで、これらは同じではありません。

代わりに、sh ssh-vpn.sh2つのより良い選択肢があります

  1. スクリプトを実行可能にし、#!使用するシェルを定義する行を作成します。

    # just once
    chmod a+rx ssh-vpn.sh
    
    # thereafter
    ./ssh-vpn.sh
    
  2. 正しいシェルでスクリプトを実行する

    bash ssh-vpn.sh
    

答え2

実装https://unix.stackexchange.com/users/100397/roaimaの回答と、開いているopenvpn接続が1つだけであることがわかったので、pkill -9 -x $process_nameコマンドを再利用できます。bash スクリプトによって作成されたプロセスを強制終了する最善の方法は何ですか?- そしてこのコードにたどり着きました

#!/bin/bash
exec 3< <(sudo openvpn --config  /etc/openvpn/server.ovpn)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
ssh server
sudo pkill -9 -x openvpn 

つまり、まとめると

  1. 上記のコードを使用してスクリプト ssh-vpn.sh を生成します (printf何が起こっているかについていくつかの情報を追加しました)

    #!/bin/bash
    printf "Script to initialise openvpn connection to XYZ and open ssh channel into XYZ Server.\n"
    printf "Starting openvpn to YXZ...\n\n"
    exec 3< <(sudo openvpn --config  /etc/openvpn/server.ovpn)
    sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
    printf "VPN now initialised.\nstarting ssh connection to XYZ...\n"
    ssh server
    printf "\nKilling openvpn connection...\n"
    sudo pkill -9 -x openvpn 
    # end of script
    
  2. 殻の中の

    # just once
    chmod a+rx ssh-vpn.sh
    
  3. シェルでコマンドを実行する

    # thereafter
    ./ssh-vpn.sh
    

関連情報