Bash

bash 腳本 openvpn,等待輸出,ssh 伺服器,結束 openvpn

  • April 19, 2020

我想使用 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 已經存在。

  1. 如何避免腳本中的語法錯誤?
  2. 如何擴展腳本以便之後自動關閉 openvpn 連接?
  3. 如何確保文件描述符在腳本結束時關閉?

如果這對於一個問題來說太多了,我深表歉意 - 我想這是我很長一段時間以來的第一個腳本問題之一,我仍然需要在這裡學習很多東西。

實施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 

所以,總而言之

  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
  1. 在殼裡
# just once
chmod a+rx ssh-vpn.sh
  1. 在shell中執行命令
# thereafter
./ssh-vpn.sh

問題是程式碼是為bashshell 編寫的,但您明確使用sh它來執行它。在越來越多的平台上,這些並不相同。

而不是sh ssh-vpn.sh你有兩個更好的選擇

  1. 使腳本可執行並讓該#!行定義要使用的 shell
# just once
chmod a+rx ssh-vpn.sh

# thereafter
./ssh-vpn.sh
  1. 使用正確的 shell 執行腳本
bash ssh-vpn.sh

引用自:https://unix.stackexchange.com/questions/578534