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
    

相关内容