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 语法的?请让我知道我出了什么问题。
这个问题与nc
或netcat
或任何他们的同类无关。您在此处运行两个命令nc
和grep
,但仅重定向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)