ホスト名リストからIPを取得して単一のファイルにマージするスクリプト/コマンド

ホスト名リストからIPを取得して単一のファイルにマージするスクリプト/コマンド

私はしばらくの間進んでいないまま努力してきたので、これは私の現在の能力を超えているようです。

これらのサーバーを調べるために、セキュリティの目的でホストとIPのリストを取得するように求められました。hosts.linuxサーバーにはすべてのホスト名を含むホストのリストがあり、IPはありません。私はこのファイルからこれらの名前を取得してから、コマンド(hostIPをインポートするためのコマンドなど)を実行するスクリプトを作成しようとしています。

このコマンドは、例えば動作します。

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 番号のリストを追加します。

関連情報