我有一个问题要获取dig命令的结果并将其传递给nmap命令,如下所示:
for ip in 'dig mydomain.com -t ns +short'
do nmap $ip
done发布于 2021-04-25 16:47:22
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实用程序将使用单词dig、mydomain.com、-t、ns和+short作为其参数。然后,它将继续抱怨-t选项,而它并不完全理解这个选项。
现在,您可以通过将单引号更改为backticks来“修复”这个问题,这会将单引号字符串转换为命令substiution,但对于遍历命令输出的一般方法来说,这是非常不优雅的,特别是因为它依赖于将输出拆分为空格上的单词,并对每个单词应用文件名全局化,还因为shell需要在开始循环的第一次迭代之前读取命令的所有输出。
以上代码的所有变体都是解决读取某些命令的输出并将其逐行输入nmap的更好方法。
https://unix.stackexchange.com/questions/646637
复制相似问题