Aqui está uma solução rápida e suja para isso em Python. Faz cache (incluindo cache negativo), mas não é necessário realizar threads e não é a coisa mais rápida que você já viu. Se você salvá-lo como algo como rdns
, pode chamá-lo assim:
zcat /var/log/some-file.gz | rdns
# ... or ...
rdns /var/log/some-file /var/log/some-other-file # ...
A execução anotará os endereços IP com seus registros PTR no local:
$ 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).
E aqui está a fonte:
#!/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.
Observe: isso não é exatamente o que você procura após a carta (usando 'ferramentas padrão'). Mas isso provavelmente ajuda mais do que um hack que resolve todos os endereços IP sempre que são encontrados. Com mais algumas linhas, você pode até fazer cache de resultados persistentemente, o que ajudaria com invocações repetidas.