コマンドの結果を取得してコマンド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
取得します。その後、よく理解していないオプションについて不平を言い続けます。dig
mydomain.com
-t
ns
+short
-t
今あなたはできる一重引用符をバックティックに変更してこの問題を「修正」すると、一重引用符で囲まれた文字列をコマンド置換に変換しますが、コマンド出力を繰り返す一般的な方法として、これはややエレガントではありません。特に、単語出力をスペースに分割し、シェルが読み取る必要があるため、各単語にファイル名ワイルドカードを適用します。すべての出力ループの最初の反復を開始する前に、コマンドを実行してください。
上記のコードのすべてのバリエーションは、いくつかのコマンドの出力を読み取り、それを1行ずつnmap
。