如何在if条件下使用netcat命令的退出码?

vam*_*olu 2 bash exit-code netcat

我在 bash 中有这个函数,它使用 netcat 检查某个地址上的端口是否打开。例如,我正在使用 localhost 3000 进行测试。

错误

我无法从运行中获取错误代码nc。我一直看到消息:

nc_output:预期的整数表达式

从 if 条件。(见下面的代码)

代码

#!/bin/bash
set -o nounset

scan() {
  local host=$1
  local port=$2
  local nc_output

  nc_output=$(nc ${host} ${port} -w 5)
  eval ${nc_output}
  if [ nc_output -ne 0 ]; then
     "PORT ${port} CLOSED on ${host}"
  else
    echo "PORT ${port} OPEN on ${host}"
  fi
}

scan 127.0.0.1 3000
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 5

我认为问题归结为以后如何将nc命令存储在变量中eval。当你做

nc_output=$(nc ${host} ${port} -w 5)
#          ^^                      ^
Run Code Online (Sandbox Code Playgroud)

标记的语法$(..)是用于命令替换 in bash,它在内部运行命令并将命令的输出存储在使用的变量中。所以上面的行运行nc命令并将返回的输出存储在变量中nc_output。请记住,这仅存储命令的标准输出,而不存储nc应从变量中获取的命令的返回码$?

我猜您的意图是将命令存储在一个变量中,然后存储eval一次并获取退出代码,但是您通过eval-ing 从nc命令返回的输出是错误的,这是迂回且不必要的。

理想的方式应该只是

nc "${host}" "${port}" -w 5
nc_exit_code=$?
Run Code Online (Sandbox Code Playgroud)

并在条件中使用此变量

if [ "$nc_exit_code" -ne 0 ]; then
Run Code Online (Sandbox Code Playgroud)

注意$变量名前的前缀。您需要使用$var语法来访问varshell 语法中的标识符的值。您没有在原始帖子中使用该符号。不这样做将比较没有意义的文字字符串nc_output0因为两者的本机类型彼此不同。

将此退出代码显式存储在变量中也是多余的,if条件直接作用于返回命令的退出代码,因此只需

if ! nc "${host}" "${port}" -w 5; then
    echo "PORT ${port} CLOSED on ${host}"
else
    echo "PORT ${port} OPEN on ${host}"
fi
Run Code Online (Sandbox Code Playgroud)

应该足以满足您的逻辑。