繁体   English   中英

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

[英]How to use the exit code of netcat command in a if condition?

我在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

我认为问题归结于如何将nc命令存储在变量中以便稍后进行eval 当你做了

nc_output=$(nc ${host} ${port} -w 5)
#          ^^                      ^

标记的语法$(..)用于bash命令替换,该命令在内部运行命令并将命令的输出存储在使用的变量中。 因此,以上行运行nc命令,并将返回的输出存储在变量nc_output 还记得这只存储命令的标准输出, 而不存储应该从变量$?获取的nc命令的返回码$?

我猜想您的意图是将命令存储在变量中,然后eval一次并获取退出代码,但是通过eval nc命令返回的输出是round回的和不必要的,您做错了。

理想的方法应该是

nc "${host}" "${port}" -w 5
nc_exit_code=$?

并在条件中使用此变量

if [ "$nc_exit_code" -ne 0 ]; then

请注意, $前缀在变量名之前。 您需要使用$var语法在shell语法中访问标识符var的值。 您没有在原始帖子中使用该符号。 否则,会将文字字符串nc_output0进行比较,这没有意义,因为两者的本机类型互不相同。

同样,将退出代码明确地存储在变量中也是多余的, if条件直接在返回命令的退出代码上起作用,那么

if ! nc "${host}" "${port}" -w 5; then
    echo "PORT ${port} CLOSED on ${host}"
else
    echo "PORT ${port} OPEN on ${host}"
fi

应该足以满足您的逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM