forループを使用せずに複数の行をパラメータに渡すにはどうすればよいですか?

forループを使用せずに複数の行をパラメータに渡すにはどうすればよいですか?

スキャンを要求されたIPのリストを含むnmap出力を処理する次のコマンドがあります。

cat ping-sweep.txt | grep "report for" | cut -d " " -f5

これにより、Webサーバーを検索したいIPのリスト(1行に1つ)のみが提供されます。

次のコマンドを使用して単一のホストをスキャンできます。

nmap -v -p 80,443,8080 10.1.1.1

リスト内のすべてのIPに対してこのスキャンを実行したいのですが、nmapで接続すると機能しないようです。これを行うにはbashスクリプトを作成する必要がありますかforeach、それとも単純なものがありませんか?

答え1

nmapスキャンするすべてのアドレスを次のパラメータで指定できます。

nmap -v -p 80,443,8080 $(grep "report for" ping-sweep.txt | cut -d" " -f5)

これはgrepファイルで実行され(必須ではなくcatgrepフィルタ処理された出力を渡し、cutその結果はnmapコマンドラインを作成するために使用されます。これは…コマンドの置き換え

シェルにはループがあり、さまざまな方法でループを使用できます。

grep "report for" ping-sweep.txt | cut -d" " -f5 | while read ip; do
    nmap -v -p 80,443,8080 "${ip}"
done

または

for ip in $(grep "report for" ping-sweep.txt | cut -d" " -f5); do
    nmap -v -p 80,443,8080 "${ip}"
done

nmap両方とも一度に1つのアドレスのみを使用して機能します。

答え2

最初のステップは、Nmapを設計された方法で使用することです。 Nmapは各ポートスキャンの前にホストスキャン(「pingスキャン」)を実行するため、次の簡単なコマンドを使用して2つのステップを同時に実行できます。

nmap -p 80,443,8080 [TARGETS]

ポートスキャンとは別にホストスキャンを実行する必要がある場合は、Nmapの強力な機械可読出力オプションを使用してください。XMLまたはグレブ出力。以前のバージョンのNmapの場合、最も簡単な方法はホスト検索を実行し、次のようにGrapable出力を保存することです。

nmap -sn [TARGETS] -oG ping-sweep.gnmap

その後、awkを使用してIPアドレスを簡単に抽出できます。

awk '/Status: Up/{print $2}' ping-sweep.gnmap > targets.txt

Nmapに直接インポートします。

nmap -p 80,443,8080 -iL targets.txt

または、Nmap 7.00以降では、保存されたXML出力形式を使用できます-oX ping-sweep.xmlターゲット-xmlNSEスクリプト:

nmap -p 80,443,8080 --script targets-xml --script-args newtargets,iX=ping-sweep.xml

これらのオプションのいずれかを使用して、ホスト検索の検索が十分に新しい場合は、ポート-Pn検索のホスト検索ステップをスキップするオプションを追加できます。これにより、同じホストがまだ実行されている可能性があるため、スキャン速度がわずかに節約されます。

あなたは何ですか本当にしてはいけないことです。ループに関連するソリューションであるか、xargs最終的に各ターゲットに対して別々のNmapインスタンスを起動します。これは、各インスタンスがネットワーク容量を監視するためにデータファイルをロードし、タイムアウトのあるプローブを送信することを繰り返す必要があり、個々のインスタンスが協力するのではなくネットワークリソースを配置して互いに競合するため、無駄で不要です。また、個々の出力を再結合する必要があります。

答え3

xargs最も一般的には、次のように各行をコマンドライン引数としてコマンドに渡すことができます。

cat ping-sweep.txt | grep "report for" | cut -d " " -f5 | xargs -I'{}' nmap -v -p 80,443,8080 '{}'

関連情報