我想使用 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