Bash
bash 腳本 openvpn,等待輸出,ssh 伺服器,結束 openvpn
我想使用 bash 腳本來啟動 openvpn 連接,一旦建立了隧道,就會啟動與伺服器的 SSH 終端連接,一旦關閉 SSH 連接,也會關閉 openvpn 連接。
首先,我嘗試將https://stackoverflow.com/questions/21001220/bash-sequence-wait-for-output-then-start-next-program中提出的解決方案作為 shell 腳本實施
#!/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 連接?
- 如何確保文件描述符在腳本結束時關閉?
如果這對於一個問題來說太多了,我深表歉意 - 我想這是我很長一段時間以來的第一個腳本問題之一,我仍然需要在這裡學習很多東西。
實施https://unix.stackexchange.com/users/100397/roaima的答案並知道我只打開了一個 openvpn 連接允許我重用 Best way 中的
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
- 在shell中執行命令
# thereafter ./ssh-vpn.sh
問題是程式碼是為
bash
shell 編寫的,但您明確使用sh
它來執行它。在越來越多的平台上,這些並不相同。而不是
sh ssh-vpn.sh
你有兩個更好的選擇
- 使腳本可執行並讓該
#!
行定義要使用的 shell# just once chmod a+rx ssh-vpn.sh # thereafter ./ssh-vpn.sh
- 使用正確的 shell 執行腳本
bash ssh-vpn.sh