nc 的 STDOUT 和 STDERR 重定向

nc 的 STDOUT 和 STDERR 重定向

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

nc -zv 1.2.3.4 55 | grep " open " >/dev/null 2>&1

或者

nc -zv 1.2.3.4 55 | grep " open " 2>&1 >/dev/null

或者

nc -zv 1.2.3.4 55 | grep " open " &>/dev/null

无论如何都会返回

'FQDN_hostname_or_domainname [1.2.3.4] 55 (?) open'

尽管如此,此组合可以与其他命令一起使用,例如netstat。这与 netcat 有关,还是与 bash 语法有关?请告诉我我哪里做错了。

答案1

nc这个问题与 或netcat或任何同类命令都无关。您在这里运行两个命令,ncgrep,但只重定向 的输出grep。您要执行的操作是:

nc -zv 1.2.3.4 55  &>/dev/null

当然,这是毫无意义的,因为如果没有输出,你就不能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.

因此,你所追求的是这样的:

nc -zv 1.2.3.4 55 2>/dev/null | grep -q " open " && start_daemon

或者,如果您还需要解析 stderr,则可以这样做:

nc -zv 1.2.3.4 55  |& grep -q " open " && start_daemon

答案2

在没有 -v 选项的情况下,使用 netcat 的 nc 退出状态成功让脚本正常运行。无论如何,似乎 netcat 的输出没有被传送到 grep。我猜这可能是由某种分叉引起的。

更新:

正如 terdon 在他的回答的评论中提到的那样,nc/的输出部分netcat打印到 stderr,部分打印到 stout。因此,在管道传输到 grep 之前合并这两个文件可以解决问题:

netcat -zvw1 1.2.3.4 55 2>&1 | grep "open"

相关内容