Đây là một giải pháp nhanh chóng và bẩn thỉu cho vấn đề này trong Python. Nó thực hiện bộ nhớ đệm (bao gồm cả bộ nhớ đệm âm), nhưng không phân luồng và không phải là thứ nhanh nhất bạn thấy. Nếu bạn lưu nó như một cái gì đó như thế rdns
, bạn có thể gọi nó như thế này:
zcat /var/log/some-file.gz | rdns
# ... or ...
rdns /var/log/some-file /var/log/some-other-file # ...
Chạy nó sẽ chú thích các địa chỉ IP với bản ghi PTR của chúng tại chỗ:
$ 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).
Và đây là nguồn:
#!/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.
Xin lưu ý: đây không hoàn toàn là những gì bạn viết sau bức thư (sử dụng 'công cụ tiêu chuẩn'). Nhưng nó có thể giúp bạn nhiều hơn một bản hack giải quyết mọi địa chỉ IP mỗi khi gặp phải. Với một vài dòng nữa, bạn thậm chí có thể làm cho nó lưu trữ kết quả của nó một cách liên tục, điều này sẽ giúp với các yêu cầu lặp lại.