разрешите все IP-адреса в выводе команды с помощью стандартных инструментов командной строки

Это - функция оболочки. При создании его в командной строке это будет существовать только для текущего вызова оболочки. Можно добавить определение файлу запуска оболочки (.bashrc, .bash_profile, и т.д.), и оно сделает это "постоянным".

Если Вы ищете bash(1) страница справочника для "Определений Функции Shell" Вы видите синтаксис для определения функций оболочки. Раздел "FUNCTIONS" вдается в большее количество подробностей самих функций.

8
18.06.2012, 20:33
5 ответов

Вот быстрое и грязное решение этого в Python. Это делает кэширование (включая отрицательное кэширование), но никакая поточная обработка и не является самой быстрой вещью, которую Вы видели. Если Вы сохраняете его как что-то как rdns, можно назвать его как это:

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

Выполнение его аннотирует IP-адреса их оперативными записями PTR:

$ 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-адрес каждый раз, когда с этим встречаются. Еще с несколькими строками можно даже заставить его постоянно кэшировать свои результаты, которые помогли бы с повторными вызовами.

8
27.01.2020, 20:10
  • 1
    Спасибо за сценарий. Это делает точно, что я искал. Я надеялся найти решение, которое не потребовало записи сценария, но это - вероятно, следующая лучшая вещь. –  Daniel 18.06.2012, 22:59

сценарий удара Вы можете кошка Ваш файл журнала и передавать по каналу в.

#!/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 
2
27.01.2020, 20:10

Если формат журнала последовательно отображает то же, поскольку Вы показываете выше, можно сделать это действительно грязное с echo 10:45 accessed by 10.13.13.10|awk '{print $4}'|nslookup

1
27.01.2020, 20:10

Я использовал бы jdresolve -n -a

Упакованный для debian, и т.д. также доступного в:

https://github.com/jdrowell/jdresolve

    jdresolve resolves IP addresses to hostnames. Any file format is
    supported, including those where the line does not begin with the IP
    address.

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

3
27.01.2020, 20:10

Быстрый жемчуг один:

perl -MSocket -pe 's/(\d+\.){3}\d+/"$&\[".gethostbyaddr(inet_aton($&), AF_INET)."]"/ge'
2
27.01.2020, 20:10

Теги

Похожие вопросы