如何在 if 条件下使用 netcat 命令的退出代码?
How to use the exit code of netcat command in a if condition?
我在 bash 中有这个功能,它使用 netcat 检查地址上的端口是否打开。例如,我正在使用 localhost 3000 进行测试。
错误
我无法从 运行 nc
获取错误代码。我一直看到消息:
nc_output: integer expression expected
来自 if 条件。 (请参阅下面的代码)
代码
#!/bin/bash
set -o nounset
scan() {
local host=
local port=
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
命令并将输出 returned 存储在变量 nc_output
中。请记住,这仅存储命令的标准输出,不 nc
命令的 return 代码应从变量 $?
[ 中获取=31=]
我猜你的意图是将命令存储在一个变量中,然后 eval
它一次并获取退出代码,但是你通过 eval
-ing 输出做错了return 从 nc
命令编辑,这是迂回且不必要的。
理想的方式应该是
nc "${host}" "${port}" -w 5
nc_exit_code=$?
并在条件中使用此变量
if [ "$nc_exit_code" -ne 0 ]; then
注意变量名前的$
前缀。您需要使用 $var
语法来访问 shell 语法中标识符 var
的值。您没有使用原始 post 中的符号。不这样做会将文字字符串 nc_output
与 0
进行比较,这没有意义,因为两者的本机类型彼此不同。
同样将此退出代码显式存储在变量中是多余的,if
条件直接作用于命令 returned 的退出代码,因此只需
if ! nc "${host}" "${port}" -w 5; then
echo "PORT ${port} CLOSED on ${host}"
else
echo "PORT ${port} OPEN on ${host}"
fi
应该足以满足您的逻辑。
我在 bash 中有这个功能,它使用 netcat 检查地址上的端口是否打开。例如,我正在使用 localhost 3000 进行测试。
错误
我无法从 运行 nc
获取错误代码。我一直看到消息:
nc_output: integer expression expected
来自 if 条件。 (请参阅下面的代码)
代码
#!/bin/bash
set -o nounset
scan() {
local host=
local port=
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
命令并将输出 returned 存储在变量 nc_output
中。请记住,这仅存储命令的标准输出,不 nc
命令的 return 代码应从变量 $?
[ 中获取=31=]
我猜你的意图是将命令存储在一个变量中,然后 eval
它一次并获取退出代码,但是你通过 eval
-ing 输出做错了return 从 nc
命令编辑,这是迂回且不必要的。
理想的方式应该是
nc "${host}" "${port}" -w 5
nc_exit_code=$?
并在条件中使用此变量
if [ "$nc_exit_code" -ne 0 ]; then
注意变量名前的$
前缀。您需要使用 $var
语法来访问 shell 语法中标识符 var
的值。您没有使用原始 post 中的符号。不这样做会将文字字符串 nc_output
与 0
进行比较,这没有意义,因为两者的本机类型彼此不同。
同样将此退出代码显式存储在变量中是多余的,if
条件直接作用于命令 returned 的退出代码,因此只需
if ! nc "${host}" "${port}" -w 5; then
echo "PORT ${port} CLOSED on ${host}"
else
echo "PORT ${port} OPEN on ${host}"
fi
应该足以满足您的逻辑。