Aquí hay una solución rápida y sucia para esto en Python. Realiza el almacenamiento en caché (incluido el almacenamiento en caché negativo), pero no el enhebrado y no es lo más rápido que has visto. Si lo guarda como algo así rdns
, puede llamarlo así:
zcat /var/log/some-file.gz | rdns
# ... or ...
rdns /var/log/some-file /var/log/some-other-file # ...
Al ejecutarlo, se anotarán las direcciones IP con sus registros PTR en el lugar:
$ 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).
Y aquí está la fuente:
#!/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.
Tenga en cuenta: esto no es exactamente lo que busca al pie de la letra (usando 'herramientas estándar'). Pero probablemente lo ayude más que un truco que resuelve cada dirección IP cada vez que se encuentra. Con unas pocas líneas más, incluso puede hacer que guarde en caché sus resultados de forma persistente, lo que ayudaría a repetir las invocaciones.