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

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 已經存在。

  1. 如何避免腳本中的語法錯誤?

  2. 如何擴充腳本以便之後自動關閉 openvpn 連線?

  3. 如何確保文件描述符在腳本結束時關閉?

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

答案1

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

相反sh ssh-vpn.sh你有兩個更好的選擇

  1. 使腳本可執行並讓該#!行定義要使用的 shell

    # just once
    chmod a+rx ssh-vpn.sh
    
    # thereafter
    ./ssh-vpn.sh
    
  2. 使用正確的 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 

所以,總而言之

  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
    
  2. 在殼裡

    # just once
    chmod a+rx ssh-vpn.sh
    
  3. 在 shell 中運行命令

    # thereafter
    ./ssh-vpn.sh
    

相關內容