在 nmap 中传递 Dig 命令

在 nmap 中传递 Dig 命令

我有一个问题,需要获取命令的结果dig并将其传递给nmap命令,例如:

for ip in 'dig mydomain.com -t ns +short'
do nmap $ip
done

答案1

您的dig命令返回多行输出。每一行都是一个主机名。您想要nmap在每个主机名上运行。

xargs实用程序用于运行带有作为输入给出的参数的命令xargs

dig mydomain.com -t ns +short | xargs -I {} nmap {}

nmap这将为 的每一行输出运行一次dig

或者,如果您想nmap并行运行,一次两个,并且您的xargs实现支持它(我不知道这对您是否有意义,但这是可能的),

dig mydomain.com -t ns +short | xargs -I {} -P 2 nmap {}

dig另一种方法是将显式循环中的输出行读while入 shell 变量,然后调用nmap该变量的值:

dig mydomain.com -t ns +short |
while IFS= read -r host; do
    nmap "$host"
done

一种变体是收集数组中的主机名(这需要一个了解数组的 shell),并nmap立即调用所有数组元素:

dig mydomain.com -t ns +short |
{ readarray -t hosts; nmap "${hosts[@]}"; }

或者,使用位置参数并执行相同的操作:

dig mydomain.com -t ns +short |
{
    set --
    while IFS= read -r host; do
        set -- "$@" "$host"
    done
    nmap "$@"
}

或者,只需使用该-iL选项nmap并以这种方式提供主机名

nmap -iL <( dig mydomain.com -t ns +short )

或者,在没有过程替代的情况下,

dig mydomain.com -t ns +short | nmap -iL -

您的代码的主要问题是您的循环将使用文字字符串dig mydomain.com -t ns +short作为 的值进行单次迭代$ip

您还在$ip循环体的调用中使用了不带引号的内容nmap,这意味着 shell 在调用该实用程序之前会将其值拆分为多个单词。该nmap实用程序将获取单词digmydomain.com-tns+short作为其参数。然后它会继续抱怨-t它不太理解的选项。

现在轮到你可以通过将单引号更改为反引号来“修复”此问题,这会将单引号字符串转换为命令替换,但是作为迭代命令输出的一般方法,这将是相当不优雅的,尤其是因为它依赖于拆分输出到空格上的单词并对每个单词应用文件名通配符,也是因为 shell 需要读取所有输出在开始循环的第一次迭代之前执行命令。

上述代码的所有变体都是解决读取某些命令的输出并将其逐行输入到nmap.

相关内容