nc 的 STDOUT 和 STDERR 重定向

Ric*_*eru 3 bash scripts stdout netcat

我正在尝试制作一个看门狗 bash 脚本,它必须根据退出状态检查端口是否打开,否则应该启动守护程序。问题是我无法通过重定向 STDOUT 和 STDERR 来避免脚本输出任何信息。

nc -zv 1.2.3.4 55 | grep " open " >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

或者

nc -zv 1.2.3.4 55 | grep " open " 2>&1 >/dev/null
Run Code Online (Sandbox Code Playgroud)

或者

nc -zv 1.2.3.4 55 | grep " open " &>/dev/null
Run Code Online (Sandbox Code Playgroud)

反正回来

'FQDN_hostname_or_domainname [1.2.3.4] 55 (?) open'
Run Code Online (Sandbox Code Playgroud)

不过,此组合可与其他命令一起使用,例如netstat. 是关于 netcat 的,还是关于 bash 语法的?请让我知道我出了什么问题。

ter*_*don 5

这个问题与ncnetcat或任何他们的同类无关。您在此处运行两个命令ncgrep,但仅重定向grep. 你想要做的是:

nc -zv 1.2.3.4 55  &>/dev/null
Run Code Online (Sandbox Code Playgroud)

当然,这毫无意义,因为如果没有输出,你就不能grep. 这就是 grep-q标志的用途:

   -q, --quiet, --silent
          Quiet;   do   not  write  anything  to  standard  output.   Exit
          immediately with zero status if any match is found, even  if  an
          error was detected.  Also see the -s or --no-messages option.
Run Code Online (Sandbox Code Playgroud)

所以,你所追求的是这样的:

nc -zv 1.2.3.4 55 2>/dev/null | grep -q " open " && start_daemon
Run Code Online (Sandbox Code Playgroud)

或者,如果您还需要解析 stderr,请执行以下操作:

nc -zv 1.2.3.4 55  |& grep -q " open " && start_daemon
Run Code Online (Sandbox Code Playgroud)