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