Замените IP-адреса именами хостов в журнале - PullRequest
4 голосов
/ 20 марта 2012

Я ищу bash-скрипт, который читает журнал и заменяет IP-адреса на имя хоста. У кого-нибудь есть идеи, как это сделать?

Ответы [ 5 ]

4 голосов
/ 20 марта 2012

Следующий скрипт должен работать. Вы можете использовать это так:

сохраните его в ip_to_hostname.sh и затем:

. / Ip_to_hostname.sh your_logfile> resolved_ip

#!/bin/bash

logFile=$1

while read line
do
        for word in $line
        do
                # if word is ip address change to hostname
                if [[ $word =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
                then
                        # check if ip address is correct
                        OIFS=$IFS
                        IFS="."
                        ip=($word)
                        IFS=$OIFS
                        if [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
                        then
                                echo -n `host $word | cut -d' ' -f 5`
                                echo -n " "
                        else
                                echo -n "$word"
                                echo -n " "
                        fi
                # else print word
                else
                        echo -n $word
                        echo -n " "
                fi
        done
        # new line
        echo
done < "$logFile"
1 голос
/ 20 марта 2012

Разрешение может быть сделано так:

ф = 72.30.38.140
имя хоста = nslookup $ip | grep name
hostname = $ {hostname # * name =}
имя хоста = $ {имя хоста%.}

Таким образом, IP-адреса не обязательно должны быть в /etc/hosts.

Сам сценарий зависит от того, как выглядит ваш журнал. Вы можете опубликовать пример?

1 голос
/ 20 марта 2012

Говоря об IPv4: вы можете создать список sed-команд из вашего файла hosts:

sed -rn 's/^(([0-9]{1,3}\.){3}([0-9]{1,3}))[ \t]([^ \t]+)[ \t].*/s#\1#\4#/p' /etc/hosts > hosts.sed 

Затем примените его к вашему лог-файлу:

sed -f hosts.sed LOGFILE

Конечно, ваши имена хостов должны быть перечислены в файле хоста.

Другой, обратный подход - использовать logresolve.

С справочной страницы:

NAME
   logresolve - Resolve IP-addresses to hostnames in Apache log files

SYNOPSIS
   logresolve [ -s filename ] [ -c ] < access_log > access_log.new

SUMMARY
   logresolve is a post-processing program to resolve IP-addresses in Apache's access logfiles. To minimize
   impact on your nameserver, logresolve has its very own internal hash-table cache. This means  that  each
   IP number will only be looked up the first time it is found in the log file.

   Takes  an  Apache  log file on standard input. The IP addresses must be the first thing on each line and
   must be separated from the remainder of the line by a space.

Таким образом, вы можете использовать REGEX для извлечения всех IP-адресов, поместить их 2 раза в новый файл, один раз в первый столбец и преобразовать его с помощью logresolve. Затем используйте эту таблицу для генерации такого sedfile, как указано выше.

0 голосов
/ 17 октября 2013

Я добавил это в свой .bashrc некоторое время назад ...

function resolve-hostname-from-ip()
{
    if [ ! $1 ]
    then 
        echo -e "${red}Please provide an ip address...${no_color}"
        return 1
    fi
    echo "" | traceroute $1|grep " 1 "|cut -d ' ' -f4|cut -d '.' -f1
}

У меня есть предопределенные цвета терминала, поэтому вы можете их пропустить, если хотите.= D

[root@somehostname ~ 08:50 AM] $ resolve-hostname-from-ip 111.22.33.444
someotherhostname

Я успешно проверил это на RHEL и SUSE.Я не проверял его на IP за пределами моего домена, поэтому я не уверен на 100%, что он будет работать во всех случаях ... надеюсь, это поможет =)

0 голосов
/ 21 марта 2012

Это модифицированная версия сценария wisent , который я в итоге использовал:

#!/bin/bash

logFile=$1

while read line
do
       for word in $line
       do
               # if word is ip address change to hostname
               if [[ $word =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,5}$ ]]
               then
                       port=$(echo "$word" | sed -e "s/.*://")
                       word=$(echo "$word" | sed -e "s/:.*//")
                       OIFS=$IFS
                       IFS="."
                       ip=($word)
                       IFS=$OIFS
                       # check if ip address is correct and not 192.168.*
                       if [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 && ${ip[0]}${ip[1]} -ne 192168 ]]
                       then
                               host=$(host $word | cut -d' ' -f 5)
                               if [[ $host =~ ^[0-9]{1,3}\(.*\)$ ]] # check for resolver errors
                               then
                                       # if the resolver failed
                                       echo -n "$word"
                                       echo -n ":$port"
                                       echo -n " "
                               else
                                       # if the resolver worked
                                       host=$(echo "$host'" | sed -e "s/\.'//" | sed ':a;N;$!ba;s/.*\n//g') # clean up cut's output
                                       echo -n "$host"
                                       echo -n ":$port"
                                       echo -n " "
                               fi
                       else
                               # if the ip address isn't correct
                               echo -n "$word"
                               echo -n ":$port"
                               echo -n " "
                       fi
               # else print word
               else
                       echo -n $word
                       echo -n " "
               fi
       done
       # new line
       echo
done < "$logFile"
...