これは私の現在のスキルを超えています。私はしばらくの間努力していて、それほど進んでいないようです。
これらのサーバーに対してスキャンを実行するためのセキュリティのために、ホストとIPのリストを取得するように求められました。サーバー上にhosts.linux
という名前のホストリストがあり、IPはなく、すべてのホスト名が含まれています。そのファイルからそれらの名前を取得し、Host
コマンドなどのコマンドを実行してIPを取得するスクリプトを考え出そうとしています。
このコマンドは、たとえば次のように機能します。
Host csx-svc-spls-06 | awk '{ print $3 }'
そのサーバーのIPのみを返します。ファイルから読み取り、コマンドを実行して、サーバーの名前とIPアドレスを1行で新しいファイルにエクスポートすることはできますか?
Digではなくnslookupを使用することの影響はわかりませんが、これでうまくいくと思います。
for i in `cat linux.hosts`; do nslookup $i | grep ^Name -A1| awk '{print $2}';echo;done > outputfile
Dig
には_+short
_オプションがあり、結果のIPアドレスのみを生成しますonly。そうしないと。
このコード:
_for h in google.com yahoo.com notfound.nosuch; do
printf '%s = ' "$h"
printf '%s' "$(Dig +short "$h")" | tr '\n' ,
echo
done
_
出力を生成します。
_google.com = 108.177.112.102,108.177.112.139,108.177.112.101,108.177.112.138,108.177.112.100,108.177.112.113
yahoo.com = 98.138.252.38,98.139.180.180,206.190.39.42
notfound.nosuch =
_
対照的に、このコード:
_for h in google.com yahoo.com notfound.nosuch; do
printf "$h = %s\\n" $(Dig +short "$h")
done
_
出力を生成します。
_google.com = 108.177.112.138
google.com = 108.177.112.100
google.com = 108.177.112.101
google.com = 108.177.112.113
google.com = 108.177.112.139
google.com = 108.177.112.102
yahoo.com = 98.139.180.180
yahoo.com = 206.190.39.42
yahoo.com = 98.138.252.38
notfound.nosuch =
_
ファイルからホスト名を読み取るには、上記のコードスニペットのfor
行をfor h in $(cat hostlist.txt); do
に置き換えます。ただし、入力検証を追加することもできます。あなた次第。
好きなのを選びな。別のフォーマットが必要な場合は、コメントしてください。
注:all必要なのがIPアドレスであり、出力にホスト名が含まれていてもかまわない場合は、all必要なのは:
_Dig +short $(cat hostlist.txt)
_
ただし、DNSに表示されないホスト名は、このコマンドでは暗黙的に無視されることに注意してください。
単一のホストで使用したコマンドでリストを反復処理するには(ホスト名自体も含めるように少し変更します):
while read h; do
Host "$h" | awk '{ print $1, $3 }'
done <linux.hosts >outputfile.txt
これはlinux.hosts
から読み取り、そこの各エントリにHost
およびawk
コマンドを適用し、結果をoutputfile.txt
に保存します。
または、必要に応じて、1行で:
while read h; do Host "$h" | awk '{ print $1, $3 }'; done <linux.hosts >outputfile.txt
以下は、ホスト名のエイリアスと複数のIPアドレスを考慮に入れ、提供されたファイルの入力行ごとに1行の出力を生成する、より一般的な方法です。
次のようなhostnames.txt
のホストのリストがあるとします。
www.uu.se
www.kth.se
www.su.se
次に、短いawk
スクリプト(script.awk
)を指定すると、
/^;/ || NF == 0 { next }
$4 == "CNAME" { cn[$5] = (cn[$5] ? cn[$5] "," $1 : $1) }
$4 == "A" { ip[$1] = (ip[$1] ? ip[$1] "," $5 : $5) }
END {
for (i in ip) {
if (cn[i])
printf("%s (%s) = ", i, cn[i])
else
printf("%s = ", i)
print ip[i]
}
}
bash
コマンドライン
Dig +noall +answer -f hostnames.txt | awk -f script.awk
作り出すだろう
su.se. (www.su.se.) = 193.11.30.171
www.kth.se. = 130.237.28.40
live.webb.uu.se. (www.uu.se.) = 130.238.7.135,130.238.7.133,130.238.7.134
これは、ホスト名のエイリアスと複数のIPアドレスを持つホストを考慮に入れます。ホスト名のエイリアスは括弧内の名前です。
Dig
コマンド自体は出力を生成します
; <<>> Dig 9.4.2-P2 <<>> www.uu.se +noall +answer
;; global options: printcmd
www.uu.se. 300 IN CNAME live.webb.uu.se.
live.webb.uu.se. 300 IN A 130.238.7.134
live.webb.uu.se. 300 IN A 130.238.7.135
live.webb.uu.se. 300 IN A 130.238.7.133
www.kth.se. 600 IN A 130.237.28.40
www.su.se. 300 IN CNAME su.se.
su.se. 300 IN A 193.11.30.171
ホスト名のリストに対するバッチクエリ(-f
)を使用します。
これは、awk
コードが解析して要約するものです。
awk
スクリプトは、ホスト名エイリアスのCNAME
エントリを検出し、実際の各ホスト名のエイリアスのコンマ区切りリストをcn
配列に保存し、同様の操作を実行します各ホスト名のIPアドレスをip
配列に保存します。
END
ブロックは、ip
配列のホスト名を調べ、エイリアスがあるかどうかを確認します。ある場合は、括弧内に表示されます。次に、IP番号のリストが行の最後に追加されます。