Bash: Etkin IP Adreslerini Ters DNS Araması


11

Bir web sunucusu erişim günlüğünden en etkin 10 IP adresini listeleyen tek satırlık bir komut var:

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

Örnek bir sonuç kümesi (basitlik için yalnızca 3 girişle):

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255

Gördüğünüz gibi, sayı IP adresinden önce gelir ve ikisi boş bir boşlukla ayrılır. Aslında sayımdan önce boş alanlar var ama burada göstermelerini sağlayamıyorum.

IP adresleri ters DNS araması yapmak istiyorum, böylece şöyle görünecektir:

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)

Bunu bir komut dosyasına başvurmadan nasıl yapabilirim (tek satırlık bir komuta bağlı kalmak)? Herhangi bir tavsiye çok takdir edilmektedir.

Yanıtlar:


16

dig +noall +answer -x <IP>Bir IP adresi aramak için kullanabilirsiniz .

Sadece IP adreslerinin listesini içeren bir dosya üzerinde döngü yapmak için:

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

Veya sayma komutunuzun çıktısını ekleyin. Bu kez sayımı ve IP adreslerini ayrı ayrı alıp tek bir satıra yazdırıyoruz:

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

Örnek (UUOC için özür dilerim):

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.

Sen boruyu daha fazla olabilir digsadece ana bilgisayar adını almak için awk içine 'ın çıkışını:

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.

Hızlı yanıt için teşekkürler! Ancak bu sefer sadece kazıdan çıktı alıyorum ve sayımı kaybettim. İstenen çıktı: <count> <IP adresi> <ters DNS araması>
GooDoo

whileGirişi beyaz alana göre böldüğünden, değiştirmek oldukça kolaydır , böylece sayımı ve IP adresini ayrı ayrı okuyabilirsiniz. Güncellememe bakın. digÇıktıyı değiştirmek için 'seçenekleri ile oynayabilirsiniz - ben gerçekten kullanmadım.
slhck

Teşekkürler! Bazı değişiklikler yaptım ve şimdi aradığım şey: 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) }') )"; doneNazik yardımınızı takdir edin!
GooDoo

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

+1 ancak btw, xargs ("xargs - standart girdiden komut satırları oluşturma ve yürütme") while döngülerine bir alternatif olacaktırcat file | xargs -n1 dig +noall +answer -x
sfussenegger 13:05
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.