Bash: การค้นหา DNS ย้อนกลับของที่อยู่ IP ที่ใช้งาน


11

ฉันมีคำสั่งบรรทัดเดียวที่แสดงที่อยู่ IP ที่ใช้งานมากที่สุด 10 อันดับแรกจากบันทึกการเข้าถึงเว็บเซิร์ฟเวอร์:

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

ชุดผลลัพธ์ตัวอย่าง (มีเพียง 3 รายการเพื่อความเรียบง่าย) จะเป็น:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255

อย่างที่คุณเห็นการนับนำหน้าที่อยู่ IP โดยที่ทั้งสองคั่นด้วยช่องว่าง จริงๆแล้วมีช่องว่างก่อนหน้าการนับด้วย แต่ฉันไม่สามารถให้พวกเขาแสดงที่นี่

ฉันชอบทำการค้นหา DNS ย้อนกลับของที่อยู่ IP เพื่อให้มีลักษณะดังนี้:

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)

ฉันจะทำสิ่งนี้ได้อย่างไรโดยไม่ต้องหันไปใช้สคริปต์ (นั่นคือการยึดคำสั่งบรรทัดเดียว) คำแนะนำใด ๆ ที่ชื่นชมมาก

คำตอบ:


16

คุณสามารถใช้dig +noall +answer -x <IP>เพื่อค้นหาที่อยู่ IP

ในการวนซ้ำไฟล์ที่มีรายการที่อยู่ IP:

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

หรือไพพ์เอาต์พุตของคำสั่งการนับของคุณ เวลานี้เราได้รับการนับและที่อยู่ IP แยกจากกันแล้วพิมพ์ลงในหนึ่งบรรทัด:

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

ตัวอย่าง (ขออภัยสำหรับ 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.

คุณสามารถเพิ่มไปป์digของเอาต์พุตใน awk เพื่อรับชื่อโฮสต์:

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.

ขอบคุณสำหรับการตอบสนองที่รวดเร็ว! อย่างไรก็ตามครั้งนี้ฉันได้รับผลลัพธ์จากการขุดเท่านั้นและฉันสูญเสียการนับ ผลลัพธ์ที่ต้องการจะเป็น: <count> <ที่อยู่ IP> <reverse DNS lookup>
GooDoo

ค่อนข้างง่ายที่จะเปลี่ยนแปลงเนื่องจากwhileแยกอินพุตตามช่องว่างดังนั้นคุณสามารถอ่านจำนวนและที่อยู่ IP แยกต่างหาก ดูการปรับปรุงของฉัน คุณสามารถเล่นกับdigตัวเลือกเพื่อเปลี่ยนผลลัพธ์ - ฉันไม่ได้ใช้มันจริงๆ
slhck

ขอบคุณ! ฉันได้ทำการแก้ไขและตอนนี้ก็เป็นสิ่งที่ฉันกำลังมองหา: 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ขอบคุณความช่วยเหลือของคุณ!
GooDoo

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

+1 แต่ btw โดยใช้ xargs ("xargs - build และดำเนินการบรรทัดคำสั่งจากอินพุตมาตรฐาน") จะเป็นทางเลือกแทนในขณะที่ลูปcat file | xargs -n1 dig +noall +answer -x
sfussenegger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.