標準のコマンドラインツールを使用して、コマンド出力のすべてのIPアドレスを解決する


8

IPアドレスの束を含むいくつかのログファイルがあります。IPアドレスを照合して解決するプログラムを介してデータをパイプできるようになりたいです。

IE cat / var / log / somelogfile | ホスト

それは次のような線を回します

10.13.13.10によってアクセスされる10:45

10:45 myhostname.intranetからアクセス

私の考えでは、sedとhostの組み合わせでこれを行う方法があるかもしれませんが、どうすればよいかわかりません。それを行う簡単なスクリプトを作成できることはわかっていますが、できれば組み込みのツールを使用できるようにしたいと思っています。助言がありますか?


2
これが通常行われないのは、これらすべてのPTRクエリを実行するのが非常に遅いためです。結果を(おそらく永続的に)キャッシュするマルチスレッドスクリプト(Pythonなど)が最適です。
Alexios

回答:


8

これは、Pythonでこれをすばやく簡単に解決する方法です。これはキャッシング(ネガティブキャッシングを含む)を実行しますが、スレッド化は行わず、これまで見た中で最速ではありません。のように保存すると、次のようrdnsに呼び出すことができます。

zcat /var/log/some-file.gz | rdns
# ... or ...
rdns /var/log/some-file /var/log/some-other-file # ...

これを実行すると、PTRレコードが配置されたIPアドレスに注釈が付けられます。

$ echo "74.125.132.147, 64.34.119.12." | rdns
74.125.132.147 (rdns: wb-in-f147.1e100.net), 64.34.119.12 (rdns: stackoverflow.com).

そしてここにソースがあります:

#!/usr/bin/env python

import sys, re, socket

cache = dict()

def resolve(x):
    key = x.group(0)
    try:
        return "%s (rdns: %s)" % (key, cache[key])
    except KeyError:
        try:
            cache[key] = socket.gethostbyaddr(key)[0]
        except socket.herror:
            cache[key] = '?'
        return "%s (rdns: %s)" % (key, cache[key])

for f in [open(x) for x in sys.argv[1:]] or [sys.stdin]:
    for line in f:
        sys.stdout.write(re.sub("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", resolve, line))

# End of file.

注意:これは、(「標準ツール」を使用して)手紙の後に書かれていることとはまったく異なります。しかし、それはおそらく、遭遇するたびにすべてのIPアドレスを解決するハック以上のものを手助けします。さらに数行を追加することで、結果を永続的にキャッシュするようにすることもできます。これにより、繰り返し呼び出しを行うのに役立ちます。


スクリプトをありがとう。それはまさに私が探していたものを実行します。スクリプトを書く必要のない解決策を見つけたいと思っていましたが、これがおそらく次善の策です。
ダニエル

3

私は使う jdresolve -n -a

debian用にパッケージ化されたものなどもあります:

https://github.com/jdrowell/jdresolve

    jdresolveは、IPアドレスをホスト名に解決します。すべてのファイル形式は
    ラインがIPで始まらないものを含むサポート
    住所。

私は10年以上、Apacheログ、Squidログ、および解決が必要な多数のIPアドレスを持つその他のものを解決するためにそれを使用しています。信頼性が高く、高速に動作し、以前の実行からのルックアップをキャッシュできます。


2

ログファイルをcatしてパイプすることができるbashスクリプト。

#!/bin/bash

while read input; do

    for arg in $( echo $input ); do
            match=$(echo "$arg" | grep -P '([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])' )
            if [ "x${match}" = "x" ]; then
                    printf "%-s" "$arg "
            else
                    dns=$( host $arg | tail -1 | awk '{print $NF}' 2>/dev/null )
                    if [ "${dns}" == "3(NXDOMAIN)" ]; then
                            printf "%-s" "$arg "
                    else
                            if [ "x${dns}" == "x" ]; then
                                    printf "%-s" "$arg "
                            else
                                    printf "%-s" "$dns "
                            fi
                    fi
            fi
    done
done
printf "\n"

出力は次のようになります。

tk-air:~ tim$ echo "10:45 accessed by 8.8.8.8" | ./get-dns 
10:45 accessed by FWDR-8.FWDR-8.FWDR-8.FWDR-8. 

tk-air:~ tim$ echo "10:45 accessed by 8.8.8.8 26 times" | ./get-dns 
10:45 accessed by FWDR-8.FWDR-8.FWDR-8.FWDR-8. 26 times 


1

ログの形式が上記と同じように一貫して表示されている場合は、 echo 10:45 accessed by 10.13.13.10|awk '{print $4}'|nslookup

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.