web-dev-qa-db-ja.com

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

これは私の現在のスキルを超えています。私はしばらくの間努力していて、それほど進んでいないようです。

これらのサーバーに対してスキャンを実行するためのセキュリティのために、ホストとIPのリストを取得するように求められました。サーバー上にhosts.linuxという名前のホストリストがあり、IPはなく、すべてのホスト名が含まれています。そのファイルからそれらの名前を取得し、Hostコマンドなどのコマンドを実行してIPを取得するスクリプトを考え出そうとしています。

このコマンドは、たとえば次のように機能します。

Host csx-svc-spls-06 | awk '{ print $3 }'

そのサーバーのIPのみを返します。ファイルから読み取り、コマンドを実行して、サーバーの名前とIPアドレスを1行で新しいファイルにエクスポートすることはできますか?

7
Ivan Windon

Digではなくnslookupを使用することの影響はわかりませんが、これでうまくいくと思います。

for i in `cat linux.hosts`; do nslookup $i | grep ^Name -A1| awk '{print $2}';echo;done > outputfile
6
Mrdeep

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に表示されないホスト名は、このコマンドでは暗黙的に無視されることに注意してください。

7
Wildcard

単一のホストで使用したコマンドでリストを反復処理するには(ホスト名自体も含めるように少し変更します):

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番号のリストが行の最後に追加されます。

1
Kusalananda