จะอ่านที่อยู่ IP ย้อนหลังได้อย่างไร


19

หากเรามีสตริงนี้ ( ที่อยู่ IP ):192.168.1.1

ฉันจะได้รับ ( แบบฟอร์มการบันทึก DNS ย้อนกลับ ) จากสายนี้ดังนั้นมันจะปรากฏเช่น1.1.168.192.in-addr.arpaใช้เปลือกสคริปต์?


จะต้องมีเปลือกหรือไม่
Braiam

1
หยุดทำอย่างนั้น
Michael Mrozek

1
ด้วยเงินจำนวนนี้ของคำตอบที่ดีกว่านี้ควรจะอยู่ใน codegolf;)
tkausl

@tkausl แบ่งปันที่นั่นหากคุณต้องการ :)
Networker

คำตอบ:


29

คุณสามารถทำมันได้ด้วยAWK มีวิธีที่ดีกว่าในการทำ แต่ฉันคิดว่าเป็นวิธีที่ง่ายที่สุด

echo '192.168.1.1' | awk 'BEGIN{FS="."}{print $4"."$3"."$2"."$1".in-addr.arpa"}'

สิ่งนี้จะกลับลำดับของที่อยู่ IP

เพียงเพื่อบันทึกการกดแป้นบางครั้งตามที่ Mikel แนะนำเราสามารถทำให้ข้อความสั้นลงได้อีก:

echo '192.168.1.1' | awk -F . '{print $4"."$3"."$2"."$1".in-addr.arpa"}'

หรือ

echo '192.168.1.1' | awk -F. '{print $4"."$3"."$2"."$1".in-addr.arpa"}'

หรือ

echo '192.168.1.1' | awk -F. -vOFS=. '{print $4,$3,$2,$1,"in-addr.arpa"}'

AWK ค่อนข้างยืดหยุ่น :)


หากคุณต้องการที่จะบันทึกการกดแป้นพิมพ์ไม่กี่ที่ควรจะเทียบเท่ากับ-F . BEGIN{FS="."}
Mikel

33

เพียงเพื่อความอยากรู้อยากเห็น ...ใช้tacจาก GNU coreutils: กำหนดตัวแปรipในรูปแบบ192.168.1.1แล้ว

$(printf %s "$ip." | tac -s.)in-addr.arpa

กล่าวคือ

$ ip=192.168.1.1
$ rr=$(printf %s "$ip." | tac -s.)in-addr.arpa
$ echo "$rr"
1.1.168.192.in-addr.arpa

9
+1 นี่คือคำตอบโปรดของฉันที่นี่ ขอบคุณที่แนะนำให้ฉันtac!
Jonathon Reinhart

ขอบคุณยังเป็นเพราะ @ StéphaneChazelasสำหรับการprintfแก้ไขที่สง่างาม(ฉันโพสต์น่าเกลียดecho -n)
steeldriver

1
ชัดเจนง่ายกว่า:printf 'arpa.in-addr.%s.' "$ip" | tac -s.
ไอแซค

17

หากคุณต้องการที่จะใช้เพียงเปลือก ( zsh, ksh93, bash) นี่เป็นวิธีอื่น:

IFS=. read w x y z <<<'192.168.1.1'
printf '%d.%d.%d.%d.in-addr.arpa.' "$z" "$y" "$x" "$w"

หรือในเปลือกเก่าธรรมดา:

echo '192.168.1.1' | { IFS=. read w x y z; echo "$z.$y.$w.$x.in-addr.arpa."; }

12

ได้อย่างง่ายดายด้วย Perl จึง:

$ echo 192.168.1.1|perl -nle 'print join ".",reverse(split /\./,$_)'
1.1.168.192

6
สามารถทำให้กะทัดรัดยิ่งขึ้นได้:perl -F'\.' -lane '$,=".";print reverse @F'
โจเซฟอาร์

6

เพื่อปัดเศษทับทิม:

ruby -r ipaddr -e 'puts IPAddr.new(ARGV.first).reverse' 192.168.1.1

ซึ่งยังรองรับ IPv6

2607:F8B0:4000:080A:0000:0000:0000:2000
=> 0.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.a.0.8.0.0.0.0.4.0.b.8.f.7.0.6.2.ip6.arpa

คุณสามารถถอด "ต้องการ" ออกจากสคริปต์:ruby -r ipaddr -e 'puts ...'
glenn jackman

5

ผ่าน GNU sed,

sed -r 's/^([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})$/\4.\3.\2.\1.in-addr.arpa/g' file

มันกลับรูปแบบที่อยู่ IPv4 ใด ๆ

ตัวอย่าง:

$ echo '192.168.1.1' | sed -r 's/^([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})$/\4.\3.\2.\1.in-addr.arpa/g'
1.1.168.192.in-addr.arpa

$ echo '192.1.1.1' | sed -r 's/^([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})$/\4.\3.\2.\1.in-addr.arpa/g'
1.1.1.192.in-addr.arpa

$ echo '1.1.1.1' | sed -r 's/^([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})$/\4.\3.\2.\1.in-addr.arpa/g'
1.1.1.1.in-addr.arpa

$ sed -r 's/^([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})$/\4.\3.\2.\1.in-addr.arpa/g' <<< '192.168.189.23'
23.189.168.192.in-addr.arpa

1
นี่คือทางออกที่เร็วที่สุด! IP 45k แปลงเป็นเพียง 0.794 วินาที
Petr Javorik

4

ใช้ห้องสมุดมาตรฐานของไพ ธ อน:

>>> ipaddress.ip_address('192.168.1.1').reverse_pointer
'1.1.168.192.in-addr.arpa'

1
นี่คือในไลบรารีมาตรฐาน 3.5 และกำหนดให้วางจำหน่ายกันยายน 2015 จากสคริปต์ที่คุณสามารถทำได้: python3.5 -c "import ipaddress; ipaddress.ip_address('192.168.1.1').reverse_pointer"(ทั้งหมดในบรรทัดเดียว)
Anthon

3

ด้วยzsh:

$ ip=192.168.1.1
$ echo ${(j:.:)${(s:.:Oa)ip}}.in-addr.arpa
1.1.168.192.in-addr.arpa

สิ่งเหล่านี้คือแฟล็กการขยายตัวแปร:

  • s:.:: sบน.
  • Oa: ย้อนกลับo rder rray
  • j:.:: j oin บน.

3

อีกความเป็นไปได้คือการใช้เครื่องมือบรรทัดคำสั่ง "ขุด" กับสวิตช์ "-x"

จริง ๆ แล้วมันจะทำคำขอในรายการ PTR แต่ถ้าคุณกรองที่ "PTR" มันจะแสดงบรรทัดแสดงความคิดเห็นหนึ่งบรรทัด (คำขอ) และอาจมีคำตอบบางอย่าง

การใช้ "dig" นั้นมีประโยชน์สำหรับการเขียนชื่อ PTR อย่างรวดเร็วโดยไม่ต้องเขียนสคริปต์ขนาดเล็ก โดยเฉพาะอย่างยิ่งถ้าคุณต้องการมันแบบโต้ตอบ (เพื่อตัดและวางผลลัพธ์) มันทำงานบน IPv6 ด้วย


2

หากคุณต้องการทำงานร่วมกับIPv6dig -xเช่นกันคุณสามารถใช้

ตัวอย่างเช่น:

$ dig -x 194.68.208.240 | egrep '^;.*PTR$' | cut -c 2- | awk '{print $1}'
240.208.68.194.in-addr.arpa.

$ dig -x 2001:db8:dc61:2a61::1 | egrep '^;.*PTR$' | cut -c 2- | awk '{print $1}'
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.6.a.2.1.6.c.d.8.b.d.0.1.0.0.2.ip6.arpa.

2

ในงูหลาม

 a = "192.168.1.122"
 import re
 m = re.search(r'(\d+)\.(\d+)\.(\d+)\.(\d+)',a)
 ip = m.group(4),m.group(3),m.group(2),m.group(1)
 '.'.join(ip) + ".in-addr.arpa"
 '122.1.168.192.in-addr.arpa'

2
หรือมากกว่าปกติ"{}.in-addr.arpa".format(".".join(reversed(a.split("."))))ใน Python2.7
iruvar

2
IFS=. ; set -- ${0+192.168.1.2}
printf %b. $4 $3 $2 $1 in-addr.arpa\\c

IFS=. ; printf %s\\n \
    in-addr.arpa ${0+192.168.1.2} |    
sed '1!G;$s/\n/./gp;h;d'

IFS=. ; printf '[%b.] ' \
    ${0+192.168.1.2.]PPPPP\\c} |dc
echo in-addr.arpa

1
$ while read ip
while> do
while> n=( $(echo $ip) ) && echo "${n[4]}"'.'"${n[3]}"'.'"${n[2]}"'.'"${n[1]}"'.'"in-addr.arpa"
while> done
192.168.1.2
2.1.168.192.in-addr.arpa

วิธีนี้คุณสามารถพิมพ์ที่อยู่และกดส่งคืนผลลัพธ์ของคุณ


1

ด้วยhostคำสั่งจากdnsutils:

$ host -t ptr 192.168.1.1 | cut -d' ' -f 2
1.1.168.192.in-addr.arpa.

ใช้งานได้เฉพาะที่อยู่ที่คุณสามารถค้นหาใน DNS ของคุณ หากคุณลองที่อยู่ที่ไม่รู้จักคุณจะได้รับข้อความแสดงข้อผิดพลาด (ซึ่งรวมถึงที่อยู่ย้อนกลับ แต่ต้องการการประมวลผลภายหลังที่แตกต่างกันเล็กน้อย)
Alexander Remesch

1

สมมติว่า var ip=192.168.2.1ประกอบด้วยทรัพย์สินทางปัญญา: หากความต้องการค่าที่จะมอบให้กับตัวแปรใหม่เพียงแค่ใส่ภายในแก้ปัญหาใด ๆและกำหนดว่าวา$()rr=$(...)

วิธีแก้ปัญหาบางอย่างเป็นไปได้:

Simplest : printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Most shells : IFS=. eval 'set -- $ip'; echo "$4.$3.$2.$1.in-addr.arpa"
บาง shell : IFS=. read d c b a <<<"$ip"; printf %s "$a.$b.$c.$d.in-addr.arpa."
: echo "$ip" | awk -F. '{OFS=FS;print $4,$3,$2,$1,"in-addr.arpa"}'
: echo "$ip" | sed -E 's/([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)$/\4.\3.\2.\1.in-addr.arpa./'
: echo "arpa.in-addr.$ip" | sed 'y/./\n/' | sed 'G;$s/\n/./gp;h;d'
: echo "$ip" | perl -F\\. -lane '$,=".";print( join(".",(reverse @F),"in-addr.arpa"))'
: dig -x "$ip" | awk -F '[; \t]+' '/^;.*PTR$/{print($2)}'
: host -t ptr 192.168.2.1 | cut -d' ' -f2

ทั้งโซลูชั่นขุดและโฮสต์ทำงานร่วมกับ IPv6


1
#!/bin/bash
# script file name reverseip.sh
if [ -z $1 ] || [ "help" == $1 ]
then
echo 'Convert a full ipv4 or ipv6 address to arpa notation'
echo "usage:"
echo ./reverseip.sh "help"
echo ./reverseip.sh "ipv4 address format: xxxx.xxxx.xxxx.xxxx"
echo ./reverseip.sh "ipv6 address format: xxxx:xxxx:xxxx:xxxx::xxxx"
echo "examples:"
echo ./reverseip.sh 216.58.207.35
echo ./reverseip.sh 2a00:1450:4001:824::2003
exit
fi

# if ip address passed containing ':'
if [[ $1 = *':'* ]];
then
# invert ipv6 address e.g.: 2a00:1450:4001:824::2003 to 3.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.4.2.8.0.1.0.0.4.0.5.4.1.0.0.a.2.
# @see lsowen https://gist.github.com/lsowen/4447d916fd19cbb7fce4
echo "$1" | awk -F: 'BEGIN {OFS=""; }{addCount = 9 - NF; for(i=1; i<=NF;i++){if(length($i) == 0){ for(j=1;j<=addCount;j++){$i = ($i "0000");} } else { $i = substr(("0000" $i), length($i)+5-4);}}; print}' | rev | sed -e "s/./&./g" | echo "$(</dev/stdin)ip6.arpa."
else
# invert ipv6 address e.g.: 216.58.207.35 to 35.207.58.216.in-addr.arpa
# @see Stéphane Chazelas /unix/132779/how-to-read-an-ip-address-backwards
echo $(printf %s "$1." | tac -s.)in-addr.arpa
fi

0

ทางเลือกที่สั้นกว่าสำหรับคำตอบของ mattbianco ที่มีเครื่องมือน้อยกว่า แต่การใช้pcregrepอาจเป็น:

$ dig -x 194.68.208.240 | pcregrep -o1 '^;(\S+)\s+IN\s+PTR$'
240.208.68.194.in-addr.arpa.

$ dig -x 2001:db8:dc61:2a61::1 | pcregrep -o1 '^;(\S+)\s+IN\s+PTR$'
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.6.a.2.1.6.c.d.8.b.d.0.1.0.0.2.ip6.arpa.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.