
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がすでに存在するため、時にはエラーメッセージが表示されるようです。
スクリプトで構文エラーを回避するには?
後でopenvpn接続を自動的に閉じるようにスクリプトを拡張するにはどうすればよいですか?
スクリプトの最後にファイル記述子を閉じるにはどうすればよいですか?
一つの質問にあまりにも多くの質問だった場合は謝罪します。これは長い間のスクリプト質問のようで、まだここで学ぶことがたくさんあります。
答え1
問題は、コードがbash
シェル用に書かれていますが、sh
それを実行するために明示的に使用することです。ますます多くのプラットフォームでは、このコンテンツは同じではありません。
代わりにsh ssh-vpn.sh
、2つのより良いオプションがあります
スクリプトを実行可能にし、この
#!
行で使用するシェルを定義します。# just once chmod a+rx ssh-vpn.sh # thereafter ./ssh-vpn.sh
正しいシェルを使用してスクリプトを実行してください。
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
だからまとめると
上記のコードを使用して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
殻に
# just once chmod a+rx ssh-vpn.sh
シェルでコマンドを実行する
# thereafter ./ssh-vpn.sh