Bash: Reverse DNS Lookup dari Alamat IP Aktif

10

Saya memiliki perintah satu baris yang mencantumkan 10 alamat IP paling aktif teratas dari log akses server web:

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

Kumpulan hasil sampel (dengan hanya 3 entri untuk kesederhanaan) adalah:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255

Seperti yang Anda lihat, hitungan mendahului alamat IP, dengan keduanya dipisahkan oleh ruang kosong. Sebenarnya ada ruang kosong sebelum penghitungan juga, tetapi saya tidak bisa membuatnya ditampilkan di sini.

Saya suka melakukan reverse DNS lookup dari alamat IP sehingga akan terlihat seperti ini:

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)

Bagaimana saya bisa melakukan ini tanpa menggunakan skrip (yaitu, berpegang pada perintah satu baris)? Setiap saran sangat dihargai.

GooDoo
sumber

Jawaban:

15

Anda dapat menggunakan dig +noall +answer -x <IP>untuk mencari alamat IP.

Untuk hanya mengulang file yang berisi daftar alamat IP:

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

Atau, pipa keluaran perintah penghitungan Anda. Kali ini kami mendapatkan hitungan dan alamat IP secara terpisah lalu mencetaknya dalam satu baris:

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

Contoh (maaf untuk 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.

Anda dapat memajukan digoutput pipa ke awk untuk mendapatkan nama host:

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.
slhck
sumber
Terima kasih atas tanggapan yang cepat! Namun, kali ini saya hanya mendapatkan output dari penggalian dan saya kehilangan hitungan. Output yang diinginkan adalah: <count> <alamat IP> <reverse DNS lookup>
GooDoo
Itu cukup mudah untuk diubah karena whilemembagi input berdasarkan spasi, sehingga Anda dapat membaca jumlah dan alamat IP secara terpisah. Lihat pembaruan saya. Anda dapat bermain dengan digopsi untuk mengubah output — saya belum pernah menggunakannya.
slhck
Terima kasih! Saya telah membuat beberapa modifikasi dan sekarang ini yang saya cari: 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) }') )"; doneHargai bantuan baik Anda!
GooDoo
for i in `cat input.txt` ; do dig +noall +answer -x $i ; done >> output.txt
+1 tetapi btw, menggunakan xargs ("xargs - membangun dan mengeksekusi baris perintah dari input standar") akan menjadi alternatif untuk sementara loopcat file | xargs -n1 dig +noall +answer -x
sfussenegger