私はしばらくの間進んでいないまま努力してきたので、これは私の現在の能力を超えているようです。
これらのサーバーを調べるために、セキュリティの目的でホストとIPのリストを取得するように求められました。hosts.linux
サーバーにはすべてのホスト名を含むホストのリストがあり、IPはありません。私はこのファイルからこれらの名前を取得してから、コマンド(host
IPをインポートするためのコマンドなど)を実行するスクリプトを作成しようとしています。
このコマンドは、例えば動作します。
host csx-svc-spls-06 | awk '{ print $3 }'
そのサーバーのIPのみを返します。ファイルから読み込み、コマンドを実行してから、サーバー名とIPアドレスを1行ずつ新しいファイルにエクスポートできますか?
答え1
digの代わりにnslookupを使用すると、どういう意味があるのかよくわかりませんが、次のようにすると効果があるようです。
while IFS= read -r i; do
nslookup "$i" | grep '^Name' -A1 |
awk '{print $2}'
echo
done < linux.hosts > outputfile
答え2
dig
+short
生成するオプションがあります。ただ生成されたIPアドレス、それ以上ではありません。
このコードは:
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
。ただし、一部の入力検証を追加することもできます。あなたに走りました。
選んでみてください。他の形式が必要な場合はコメントしてください。
注: もしみんな必要なのはIPアドレスで、出力にホスト名が含まれているかどうかは関係ありません。みんなあなたに必要なもの:
dig +short $(cat hostlist.txt)
ただし、DNSに表示されないホスト名はこのコマンドによって無視されることに注意してください。
答え3
単一のホストで使用するコマンドを使用してリストを繰り返すだけです(ホスト名自体を含むように少し変更されます)。
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 番号のリストを追加します。