如何通过 bash 脚本快速找出服务器上的 80 端口是否打开或正在监听?
通常情况下,守护进程在所有工作站上都在运行,但有时会失败。我使用以下命令检查 IP 地址是否有开放端口。我希望能够对文件中的每一行执行此操作,而不必每次都手动输入。
nc -zw3 10.101.0.13 80 && echo "opened" || echo "closed"
列表文件如下所示,其中3333
和3334
是后面的字符串$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