在不同服务器和端口上使用netcat操作的Bash脚本

时间:2018-06-25 14:29:14

标签: bash shell server netcat

我有点迷茫。我创建了一个脚本,该脚本首先从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

1 个答案:

答案 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