检查打开的 22 个端口的 BASH 脚本中的 WHILE 循环中的 IF 失败

检查打开的 22 个端口的 BASH 脚本中的 WHILE 循环中的 IF 失败

我正在尝试创建一个相当基本的脚本来运行服务器列表并检查 SSH 端口是否已打开nc。我尝试了几种不同的方法,但似乎无法使其发挥作用。我绝对不擅长任何类型的脚本编写。

这是脚本。我只是希望它在nc.txt 中的命令的响应中看到“成功”时执行操作OPEN

while read SERVER
do
OPEN=$(nc -z -v -w5 $SERVER 22)
echo $SERVER
   if [[ $OPEN = *"suc"* ]];
    then
        echo "Found SSH open on $SERVER"
    else
        echo "No open ports on $SERVER!"    
   fi
done < server.txt

服务器列表位于server.txt脚本末尾引用的文件中。

这是我得到的答复。我不

nc: connect to 10.10.51.55 port 22 (tcp) failed: No route to host
10.10.51.55
No open ports on test1!
Connection to 10.10.51.65 22 port [tcp/ssh] succeeded!
10.10.50.65
No open ports in test2!

无论如何,它都会给我“$SERVER 上没有开放端口”。

我感谢您的任何指导。

答案1

注释,评论太长了。

  1. server.txt最好可以命名server-list或者servers.txt如果您愿意的话。

  2. 使用小写变量名称,例如,避免SERVER和类似的,最好server_ip无论如何命名,因为不清楚您是否使用主机名或IP。

  3. 双引号所有非整数变量,例如"$server_ip".

  4. 使用直接if语句而不是$OPEN重定向到黑洞 ( /dev/null) 的变量。


根据上面重写:

#!/bin/sh

while read -r server_ip; do

    if nc -z -v -w5 "$server_ip" 22 >/dev/null 2>&1; then
        echo "Found SSH port open on $server_ip."
    else
        echo "Did not find open SSH port on $server_ip." >&2
    fi

done < server-list

答案2

最简单的解决方案似乎是:

if nc -z -v -w5 $SERVER 22 >/dev/null 2>&1;
then
    echo "Found SSH open on $SERVER"
else
    echo "No open ports on $SERVER!"    
fi

答案3

问题在于nc输出诊断消息时写入标准错误,而命令替换仅捕获标准输出。

您还应该==在 中使用[[ ... ]]。变量扩展应该被引用,理想情况下,您将用来printf输出变量数据。

这意味着您的代码可能类似于

while IFS= read -r SERVER do
    OPEN=$( nc -z -v -w5 "$SERVER" 22 2>&1 )
    if [[ "$OPEN" == *succ* ]]; then
        printf 'Found SSH open on %s\n' "$SERVER"
    else
        printf 'No open ports on %s!\n' "$SERVER"    
    fi
done <server.txt

或者

while IFS= read -r SERVER do
    OPEN=$( nc -z -v -w5 "$SERVER" 22 2>&1 )
    case "$OPEN" in
        *succ*) printf 'Found SSH open on %s\n' "$SERVER" ;;
        *)      printf 'No open ports on %s!\n' "$SERVER"  ;;
    esac
done <server.txt

或者,您可以只使用以下退出状态nc

while IFS= read -r SERVER do
    if nc -z -v -w5 "$SERVER" 22 >/dev/null 2>&1; then
        printf 'Found SSH open on %s\n' "$SERVER"
    else
        printf 'No open ports on %s!\n' "$SERVER"
    fi
done <server.txt

相关内容