回答:
何らかの理由でOSフィンガープリントを実行したくない場合は、よりターゲットを絞ったポートスキャンを実行できます。
nmap -p 9100,515,631 192.168.1.1/24 -oX printers.xml
プリンターと印刷システムに共通のポートをスキャンします。
出力はXMLです。
この返信は、最初の質問に直接回答します。2番目の質問では、コマンドを理解すると、プリンターのIPアドレスもファイルに入れることができます。だからここに行きます:
nmap -p 515,631,9100 -oG - 10.81.129.0/24 | gawk '/open/{print $2}' | xargs --delimiter='\n' nmap -sU -p 161 -oG - | gawk '/open/{print $2}' | xargs --replace=$ipaddress snmpget -v 1 -O v -c public $ipaddress system.sysDescr.0 | sed 's/STRING:\s//'
nmapの - ネットワークスキャン。(Nmap.org)
-p 515,631,9100
TCPポート515、631、および9100をスキャンします。-oG -
grep対応の出力形式を使用します。-sU -p 161
UDPポート161をスキャンします。gawkのかAWK - プロセス、列指向のテキストデータ。デフォルトでは、空白は行を列に分割します。(ウィキペディア)
gawk '/regexp/'
この正規表現に一致する行を除外するには、gawkで正規表現を使用します。gawk '{<code>}'
awk Cのような入力言語を使用して、出力を操作します。gawk '{/open/print $2}'
「open」に一致する行を検索し、2番目の列を印刷します。xarg - ビルドして与えられた入力からコマンドを実行します。デフォルトでは、空白は行を引数に分割します。(ウィキペディア)
--delimiter='\n'
空白ではなく、改行(\ n)ごとに引数を区切ります。--replace=$ipaddress
各行について、引数を$ ipaddressに保存します。snmpgetまたはsnmpwalk - SNMP GET要求を使用して、ネットワークエンティティに関する情報を照会します。(net-snmp.org、Wikipediaの SNMPに関する詳細)
-c public
コミュニティストリングをパブリックに設定します。-v 1
SNMPバージョンを1に設定します。-O v
OIDを出力しません。system.sysDescr.0
照会する変数。この特定の変数の説明:「エンティティのテキストによる説明。この値には、システムのハードウェアタイプ、ソフトウェアオペレーティングシステム、およびネットワークソフトウェアの完全な名前とバージョンIDを含める必要があります。 」sedの - パースした変換テキスト。(ウィキペディア)
's/day/night/'
文字列dayが最初に出現する行を見つけて、それをnightに置き換えます。's/STRING:\s//'
STRING:\ sを見つけて、何も置き換えないでください。これにより、STRING:\ sが入力から削除されます。\ sは空白を表します。UNIXでサポートされているコマンドがいくつかあります。個人的には、Cygwinを使用してこれらのコマンドを取得するWindowsマシンでこのチェーンを動作させました。
nmap -p 515,631,9100 -oG - 192.168.100.0/24 | gawk '/open/{print $2}' | xargs --delimiter='\n' nmap -sU -p 161 -oG - | gawk '/open/{print $2}' | xargs -I{} sh -c 'echo {} ; snmpget -v 1 -O v -c public {} system.sysDescr.0' | sed 's/STRING:\s//'