我有一个 IP 列表,我需要使用 来检查它们是否打开了端口nmap
。到目前为止,我的脚本是这样的:
#!/bin/bash
filename="$1"
port="$2"
echo "STARTING NMAP"
while IFS= read -r line
do
nmap --host-timeout 15s -n $line -p $2 -oN output.txt | grep "Discovered open port" | awk {'print $6'} | awk -F/ {'print $1'} >> total.txt
done <"$filename"
它工作得很好,但速度很慢,例如,我想一次检查文件中的 100 个 IP,而不是一一运行它们。
答案1
这是一种方法:
#!/bin/bash
filename="$1"
port="$2"
echo "STARTING NMAP"
## Read the file in batches of 100 lines
for((i=100;i<=$(wc -l < "$filename");i+=100)); do
head -n "$i" "$filename" | tail -n 100 |
while IFS= read -r line
do
## Launch the command in the background
nmap --host-timeout 15s -n $line -p $2 -oN output.txt |
grep "Discovered open port" | awk {'print $6'} |
awk -F/ {'print $1'} >> total.txt &
done
## Wait for this batch to finish before moving to the next one
## so you don't spam your CPU
wait
done
答案2
您可以使用 -iL 选项将文件传递到目标 IP 地址列表,这些地址可以用空格、制表符或换行符分隔,并且不需要循环。
答案3
您可以在后台运行命令:
nmap ... >> total.txt &
在脚本中等待所有后台进程完成可能很有用:
[...]
done <"$filename"
wait