根据列表快速扫描本地网络上的开放端口

根据列表快速扫描本地网络上的开放端口

如何通过 bash 脚本快速找出服务器上的 80 端口是否打开或正在监听?

通常情况下,守护进程在所有工作站上都​​在运行,但有时会失败。我使用以下命令检查 IP 地址是否有开放端口。我希望能够对文件中的每一行执行此操作,而不必每次都手动输入。

 nc -zw3 10.101.0.13 80 && echo "opened" || echo "closed"

列表文件如下所示,其中33333334是后面的字符串$ip;

10.101.0.13; 3333
10.101.0.15; 3334
10.101.0.17; 4143
10.101.0.21; 1445
10.101.0.27; 2443
10.101.0.31; 2445
10.101.0.47; 3443
10.101.0.61; 3445

我必须将开放的端口与关闭的端口分开,这样我就会得到一份需要修复的故障服务器列表。

我尝试了这样的事情,但没有成功:

while IFS=";" read ip port ; do nc -zw3 "$ip" "$port" && echo "$ip:$port => opened" || echo "$ip:$port =>  closed" ; done < list.txt

while IFS=";" read ip port ; do nc -zw3 "${ip}" "${port}" && echo "${ip}:${port} => opened" || echo "${ip}:${port} =>  closed" ; done < list.txt

答案1

这是最基本、最有效的 Nmap 命令,可以执行您想要的操作(仅此而已):

#!/bin/sh
# Gather the IPs to scan for each port
perl -lanF\; -e'push @{$p{$F[1]}}, $F[0];END{$,=" ";while(($x,$y)=each%p){print $x,@$y}}' input.txt | while read port ips; do
  # Scan the appropriate port for each set of IPs
  nmap -Pn -n -oG - -p $port $ips |\
  # Put the open ones into open.txt and the closed/filtered into closed.txt
  awk 'OFS=":";$4~/^Ports:/{if(/open/){print $2,'$port' >> "open.txt"}else{print $2,'$port' >> "closed.txt"}}'
done

不幸的是,Nmap 没有内置方法来仅扫描某些 IP 上的某些端口和其他 IP 上的其他端口,否则这会简单得多。

答案2

#!/bin/bash
N=0
cat $1 | while read line
do
    N=$((N+1))
    nc -zw3 $( echo $line | tr -d ';' ) && echo -e "OPEN\t$( echo $line | sed 's/; /:/g' )" || echo -e "CLOSED\t$( echo $line | sed 's/; /:/g' )" 
done

用法:./script.sh 扫描指定的文件并测试每个“$ip; $port”是否打开或关闭。

如果您想要排序输出: ./script.sh | sort

无需安装。

您可以将其粘贴到终端中而无需编写 shell 脚本:

N=0; cat FILENAME | while read line; do; N=$((N+1)); nc -zw3 $( echo $line | tr -d ';' ) && echo -e "OPEN\t$( echo $line | sed 's/; /:/g' )" || echo -e "CLOSED\t$( echo $line | sed 's/; /:/g' )"; done

答案3

最简单的就是安装nmap从 repos 中,然后执行以下操作:

   awk -F ";" '{print $1}' data | xargs -L 1 nmap -p 80

在哪里数据是包含要扫描的 IP 地址的文件。

编辑:

如果确实如此,正如@pabouk 在下面所建议的那样,IP 地址后面的数字是需要扫描的端口,那么您可以按如下方式实现所需的扫描:

   awk -F ";" '{print "nmap " $1 " -p" $2}' data | xargs -I % sh -c '%'

如果您希望扫描端口 80 和从文件读取的端口,您可以使用以下命令执行:

   awk -F ";" '{print "nmap " $1 " -p80," $2}' data | xargs -I % sh -c '%'

如果nmap被认为会产生太多输出,可以使用以下命令:

   awk -F ";" '{print "nmap -oG - " $1 " -p80," $2}' data | xargs -I % sh -c '%' | grep Ports

相关内容