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一度に2つずつ並列に実行してxargs実装でこれをサポートする場合(これが理解できるかどうかはわかりませんが、可能です)

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

dig別のアプローチは、明示的なループの出力行をwhileシェル変数として読み込み、nmapその変数の値を呼び出すことです。

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

1つのバリエーションは、配列のホスト名を収集し(配列を理解するシェルが必要です)、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。これは、シェルがユーティリティを呼び出す前に値を単語に分割することを意味します。ユーティリティは、、、および単語を引数としてnmap取得します。その後、よく理解していないオプションについて不平を言い続けます。digmydomain.com-tns+short-t

今あなたはできる一重引用符をバックティックに変更してこの問題を「修正」すると、一重引用符で囲まれた文字列をコマンド置換に変換しますが、コマンド出力を繰り返す一般的な方法として、これはややエレガントではありません。特に、単語出力をスペースに分割し、シェルが読み取る必要があるため、各単語にファイル名ワイルドカードを適用します。すべての出力ループの最初の反復を開始する前に、コマンドを実行してください。

上記のコードのすべてのバリエーションは、いくつかのコマンドの出力を読み取り、それを1行ずつnmap

関連情報