bash 多线程

bash 多线程

我有一个 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

相关内容