如何捕获瞬间在后台运行的openssl命令的输出

时间:2018-04-11 18:14:51

标签: shell openssl

我有大约300多台服务器来检查特定端口是否打开。

OpenSSL需要5分钟才能响应整个输出。但我不需要整个输出。我只是希望看到CONNECTED消息,如果有效,会立即弹出。

所以,我使用下面的代码在几秒钟后终止OpenSSL。

示例输出: [345534@localhost tmp]$ echo "x" | openssl s_client -connect 192.168.18.10:500 CONNECTED(00000003) ^C

为此,我正在使用:

echo "x" | openssl s_client -connect 192.168.18.10:500 & sleep 4 echo "Teriminating openssl for cleanup." pkill -f openssl echo "done"

问题: 有没有办法捕获OpenSSL命令(在后台运行)输出而无需等待5分钟来确定是否建立了端口连接?

我已经尝试了以下程序,没有去:

echo "x" | openssl s_client -connect 192.168.18.10:500 > /tmp/_out &

sleep 4

a=$(</tmp/_out)

echo $a

pkill -f openssl

2 个答案:

答案 0 :(得分:0)

为什么不使用timeout而不必使用openssl命令?

# save the exit code on the same line to prevent future bugs if
# someone inserts any code between the openssl call and the if block
timeout 4 openssl s_client -connect 192.168.18.10:500 >/tmp/_out 2>/tmp/_error; ec=$?
if ((ec == 124)); then
  # openssl timed out
elif ((ec != 0)); then
  # openssl failed
  cat /tmp/_error
else
  # openssl succeeded
  cat /tmp/_out
fi

答案 1 :(得分:0)

您可以在$!中找到最近执行的后台(异步)命令的PID。你可能会这样做。

cat server_list | while read s; do
  echo "x" | openssl s_client -connect 192.168.18.10:500 > /tmp/_out_$s &
  export opensslPid=$!
  # open a new shell, and send in background immediately
  (sleep $timeOut; echo "Killed with timeout" >> /tmp/_out_$s; kill $opensslPid)&
done

您剩下的是监控/ tmp / 中的文件 *。

如果您不希望所有300个流程并行运行,您可以尝试https://unix.stackexchange.com/questions/272545/is-there-a-limit-to-processes-i-can-run-in-the-backgroundBash: limit the number of concurrent jobs?

之类的操作