Bash: Tra cứu DNS ngược của các địa chỉ IP đang hoạt động


10

Tôi có một lệnh một dòng liệt kê 10 địa chỉ IP hoạt động mạnh nhất từ ​​nhật ký truy cập máy chủ web:

cat access.log | awk '{print $1}' | sort | uniq -c | sort -n | tail -n10

Một tập kết quả mẫu (chỉ có 3 mục để đơn giản) sẽ là:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255

Như bạn có thể thấy, số đếm đi trước địa chỉ IP, với hai khoảng cách được phân tách bằng một khoảng trắng. Thực tế cũng có những khoảng trống trước số đếm nhưng tôi không thể để chúng hiển thị ở đây.

Tôi muốn thực hiện tra cứu DNS ngược các địa chỉ IP để nó trông như thế này:

20 12.34.56.7 (d12-34-56-7.abhsia.telus.net)
22 3.67.89.201 (customer.vpls.net)
29 9.0.203.255 (9-0-203-255.hlrn.qwest.net)

Làm thế nào tôi có thể làm điều này mà không cần dùng đến một kịch bản (nghĩa là bám vào lệnh một dòng)? Bất cứ lời khuyên được nhiều đánh giá cao.

Câu trả lời:


15

Bạn có thể sử dụng dig +noall +answer -x <IP>để tra cứu một địa chỉ IP.

Để chỉ cần lặp qua một tệp chứa danh sách các địa chỉ IP:

while read ip; do dig +noall +answer -x $ip; done < ips.txt

Hoặc, dẫn đầu ra của lệnh đếm của bạn. Lần này chúng tôi lấy số đếm và địa chỉ IP riêng biệt và sau đó in chúng trên một dòng:

cat access.log | awk '{print $1}' | sort | 
uniq -c | sort -n | tail -n10 |
while read count ip; do printf "%d " $count; printf "%s " $ip; dig +noall +answer -x $ip; done

Ví dụ (xin lỗi cho UUOC):

cat test | while read count ip; do printf "%d " $count; printf "%s " $ip; dig +noall +answer -x $ip; done
20 8.8.8.8 8.8.8.8.in-addr.arpa.    52767   IN  PTR google-public-dns-a.google.com.
22 8.8.4.4 4.4.8.8.in-addr.arpa.    61369   IN  PTR google-public-dns-b.google.com.

Bạn có thể thêm digđầu ra của ống vào awk để lấy tên máy chủ:

cat test | while read count ip; do printf "%d " $count; printf "%s " $ip; echo $(dig +noall +answer -x $ip | awk '{ print $(NF) }'); done
20 8.8.8.8 google-public-dns-a.google.com.
22 8.8.4.4 google-public-dns-b.google.com.

Cảm ơn đã phản ứng kịp thời! Tuy nhiên, lần này tôi chỉ nhận được đầu ra từ đào và tôi đã mất số đếm. Đầu ra mong muốn sẽ là: <Count> <địa chỉ IP> <tra cứu DNS ngược>
GooDoo

Điều đó khá dễ thay đổi vì whilephân chia đầu vào dựa trên khoảng trắng, do đó bạn có thể đọc riêng số lượng và địa chỉ IP. Xem cập nhật của tôi. Bạn có thể chơi với digcác tùy chọn để thay đổi đầu ra mà tôi chưa sử dụng.
slhck

Cảm ơn! Tôi đã thực hiện một số sửa đổi và bây giờ đó là điều tôi đang tìm kiếm: cat access.log | awk '{print $1}' | sort | uniq -c | sort -n | sed "s/^[ \t]*//" | tail -n10 | while read count ip ; do echo "$count " "$ip" "( $(dig +noall +answer -x $ip | awk '{ print $(NF) }') )"; doneĐánh giá cao sự giúp đỡ của bạn!
GooDoo

for i in `cat input.txt` ; do dig +noall +answer -x $i ; done >> output.txt

+1 nhưng btw, sử dụng xargs ("xargs - xây dựng và thực thi các dòng lệnh từ đầu vào tiêu chuẩn") sẽ là một cách thay thế trong khi các vòng lặpcat file | xargs -n1 dig +noall +answer -x
sfussalanger 13/03/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.