Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不同的服务器和端口上使用netcat操作的Bash脚本_Bash_Shell_Server_Netcat - Fatal编程技术网

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

在不同的服务器和端口上使用netcat操作的Bash脚本,bash,shell,server,netcat,Bash,Shell,Server,Netcat,我有点迷路了。我创建了一个脚本,首先从CSV文件检索数据。每行包含一个IP地址和几个要测试的端口。目标是验证是否可以在特定端口上连接到每个服务器(在给定IP下)。为了验证,使用以下代码: nc -w 3 -v $ipValeur >> retour.txt 2>&1 然而,它不工作,并且返回连接超时。真奇怪。事实上,如果我从终端启动telnet命令,它就会工作。然而,目标是检查服务器是否可以连接到其他许多服务器。因此,如果使用telnet,它将非常长(一天或两天?)

我有点迷路了。我创建了一个脚本,首先从CSV文件检索数据。每行包含一个IP地址和几个要测试的端口。目标是验证是否可以在特定端口上连接到每个服务器(在给定IP下)。为了验证,使用以下代码:

nc -w 3 -v $ipValeur >> retour.txt 2>&1
然而,它不工作,并且返回连接超时。真奇怪。事实上,如果我从终端启动
telnet
命令,它就会工作。然而,目标是检查服务器是否可以连接到其他许多服务器。因此,如果使用
telnet
,它将非常长(一天或两天?)

因此,我正在寻找一种方法,允许在几个端口上自动验证从一台服务器到三十台其他服务器的访问。您可以找到在中实际使用的代码

谢谢你的帮助

解决方案

#!/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
#/bin/bash
输入文件=$1
而IFS=''读-r行| |[-n“$line”];做

如果s=';'read-ra cvsline答案可能是,在命令中:
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
和输出样本:

$ ./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

当您使用
nc
时,
$ipValeur
的值是否与您期望的值相符?当您手动运行相同的
nc
命令(而不是telnet)时,它是否可以从命令行工作?@larsk:是的,我已经验证过几次了。然而,问题应该是nc命令使用不当?事实上,这可能是由于操作结束时连接不好或断开连接造成的(有一两次,我使用了ctrl-c。我猜它已连接,但其他行没有连接)。明天我将尝试使用它。感谢您的帮助。调试方法:1)注释“nc-w 3-v…”并替换为
true
命令,它应显示所有连接的内容2)检查
nc
命令的输出并退出返回的代码。如果在步骤1出现问题-在您的CVS文件和BASH版本的某个位置,如果在步骤2 - NC工作错误,您可能会考虑使用另一个工具,当我从NC命令中有超时时,它似乎会到达。请你解释一下第二步要做什么操作,它是有效的。我已经把问题的解决办法付诸实践了。谢谢@Reishin的帮助。@vincent在向端口发送数据时,您的变体仍然错误。我已经用netcat的正确参数更新了netcat命令。问题是,如果远程服务器本身没有断开连接,netcat会保留该连接以发送数据,这就是原因。
$ ./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