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)
我认为问题归结为以后如何将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_output,0因为两者的本机类型彼此不同。
将此退出代码显式存储在变量中也是多余的,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)
应该足以满足您的逻辑。