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 Shellでsh ssh-vpn.shとしてこのスクリプトを実行します。

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

また、これらのコマンドをスクリプトとして使用しないと、ファイルディスクリプタ3がすでに存在するため、時にはエラーメッセージが表示されるようです。

  1. スクリプトで構文エラーを回避するには?

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

  3. スクリプトの最後にファイル記述子を閉じるにはどうすればよいですか?

一つの質問にあまりにも多くの質問だった場合は謝罪します。これは長い間のスクリプト質問のようで、まだここで学ぶことがたくさんあります。

答え1

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

代わりにsh ssh-vpn.sh、2つのより良いオプションがあります

  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
    

関連情報