我有点迷茫。我创建了一个脚本,该脚本首先从CSV文件中检索数据。每行包含一个IP地址和一些要测试的端口。目的是验证是否可以在特定端口上连接到每个服务器(在给定IP下)。为了验证,使用了以下代码:
nc -w 3 -v $ipValeur >> retour.txt 2>&1
尽管如此,它不起作用并且返回Connection Timed out
。它很奇怪。实际上,如果我从终端启动telnet
命令,它将起作用。但是,目标是检查服务器是否可以连接到许多其他服务器。因此,如果使用telnet
,它将非常长(一两天?)...
因此,我正在寻找一种方法,该方法可以自动验证从一台服务器到几个端口上的三十台服务器的访问。您可以在How to continue next iteration when an error occurs in Bash中找到实际使用的代码。
谢谢您的帮助。
解决方案
#!/bin/bash
INPUT_FILE=$1
while IFS='' read -r line || [ -n "$line" ]; do
IFS=';' read -ra cvsline <<<${line}
HOSTNAME=${cvsline[0]}
ports=("${cvsline[@]:1}")
for port in ${ports[*]}; do
echo -n "Verification ${HOSTNAME}:${port}..."
echo 'QUIT' | nc -w 3 -v "${HOSTNAME}" "${port}" >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "OK"
else
echo "KO"
fi
done
done < $INPUT_FILE
Vinz
答案 0 :(得分:1)
答案可能是,在命令nc -w 3 -v $ipValeur >> retour.txt 2>&1
中您没有传递端口号,并且一直使用默认端口号
我真的无法理解您的源代码,因此我根据描述编写了自己的代码:
#!/bin/bash
INPUT_FILE=$1
while IFS='' read -r line || [ -n "$line" ]; do
IFS=';' read -ra cvsline <<<${line}
HOSTNAME=${cvsline[0]}
ports=("${cvsline[@]:1}")
for port in ${ports[*]}; do
echo -n "Cheking ${HOSTNAME}:${port}..."
nc -zw 3 "${HOSTNAME}" "${port}" >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "connected"
else
echo "not connected"
fi
done
done < $INPUT_FILE
用法: ./script hostlist.cvs
其中hostlist.cvs:
127.0.0.1;80;90;100;
127.0.0.2;80;88;21;
10.255.0.1;80;443;
并输出示例:
$ ./test.sh /tmp/1
Cheking 127.0.0.1:80...not connected
Cheking 127.0.0.1:90...not connected
Cheking 127.0.0.1:100...not connected
Cheking 127.0.0.2:80...not connected
Cheking 127.0.0.2:88...not connected
Cheking 127.0.0.2:21...not connected
Cheking 10.255.0.1:80...connected
Cheking 10.255.0.1:443...not connected