在我的情况下,我必须在ssh进入服务器之前运行openvpn
,并且openvpn
命令回显“初始化序列已完成”。
所以,我希望我的脚本设置openvpn
,然后设置ssh。
我的问题是:你如何在后台执行bash命令并等待它在运行另一个程序之前回显“已完成”?
我目前的做法是打开2个终端窗格,其中一个正在运行:
sudo openvpn --config FILE
在另一个我跑:
ssh SERVER
一旦第一个终端窗格显示“初始化序列已完成”文本。
答案 0 :(得分:16)
好像你想要run openvpn as a process in the background while processing its stdout in the foreground。
exec 3< <(sudo openvpn --config FILE)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
# VPN initialization is now complete and running in the background
ssh SERVER
让我们把它分成几部分:
echo <(sudo openvpn --config FILE)
会打印出/dev/fd63
之类的内容
<(..)
在后台运行 openvpn ,并且...... echo
exec 3< /dev/fd63
3
sed '/Initialization Sequence Completed$/q' <&3
3
中读取它cat <&3 &
3
并最终阻止,如果没有任何内容读取基本思想是在后台运行openvpn
,但在某处捕获其输出,以便我们可以在前台运行一个命令,直到它读取魔术词“初始化序列已完成”。上面的代码尝试在不创建混乱的临时文件的情况下执行此操作,但更简单的方法可能只是使用临时文件。
答案 1 :(得分:1)
在grep中使用-m 1
和--line-buffered
在连续流中的第一次匹配后终止grep。这应该有效:
sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER