我想使用 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 連線?
如何確保文件描述符在腳本結束時關閉?
如果這對一個問題來說太多了,我深表歉意 - 我想這是我很長一段時間以來的第一個腳本問題,我仍然需要在這裡學習很多東西。
答案1
問題是程式碼是為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
答案2
實施https://unix.stackexchange.com/users/100397/roaima的答案並知道我只打開了一個 openvpn 連接,這使我可以重複使用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