我有一个问题,需要获取命令的结果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
实用程序将获取单词dig
、mydomain.com
、-t
、ns
和+short
作为其参数。然后它会继续抱怨-t
它不太理解的选项。
现在轮到你可以通过将单引号更改为反引号来“修复”此问题,这会将单引号字符串转换为命令替换,但是作为迭代命令输出的一般方法,这将是相当不优雅的,尤其是因为它依赖于拆分输出到空格上的单词并对每个单词应用文件名通配符,也是因为 shell 需要读取所有输出在开始循环的第一次迭代之前执行命令。
上述代码的所有变体都是解决读取某些命令的输出并将其逐行输入到nmap
.