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 がすでに存在しているためにエラー メッセージが表示されることがありました。
スクリプトの構文エラーを回避するにはどうすればよいですか?
その後、openvpn 接続を自動的に閉じるようにスクリプトを拡張するにはどうすればよいですか?
スクリプトの終了時にファイル記述子が閉じられるようにするにはどうすればよいですか?
1 つの質問としては多すぎる場合は申し訳ありません。これは私にとって久しぶりのスクリプトに関する質問の 1 つであり、まだ学ぶべきことがたくさんあります。
答え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