Bagaimana cara membaca alamat IP secara terbalik?


19

Jika kami memiliki string ini ( alamat IP ):192.168.1.1

Bagaimana saya bisa mendapatkan ( bentuk catatan balik DNS ) dari string ini, sehingga akan ditampilkan seperti 1.1.168.192.in-addr.arpamenggunakan skrip shell?


Itu harus dengan shell?
Braiam

1
Berhentilah melakukan itu
Michael Mrozek

1
Dengan jumlah jawaban ini, ini sebaiknya dalam codegolf;)
tkausl

@tkausl, bagikan di sana jika Anda mau :)
Networker

Jawaban:


29

Anda dapat melakukannya dengan AWK . Ada cara yang lebih baik untuk melakukannya, tetapi ini adalah yang paling sederhana, saya pikir.

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

Ini akan membalik urutan alamat IP.

Hanya untuk menghemat beberapa penekanan tombol, seperti yang disarankan Mikel, kita dapat lebih mempersingkat pernyataan atas:

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

ATAU

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

ATAU

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

AWK cukup fleksibel. :)


Jika Anda ingin menyimpan beberapa penekanan tombol, -F .harus sama dengan BEGIN{FS="."}.
Mikel

33

Hanya untuk nilai rasa ingin tahu ... menggunakan tacdari coreutils GNU: diberikan variabel ipdalam bentuk 192.168.1.1kemudian

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

yaitu

$ 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 Ini pasti jawaban favorit saya di sini. Terima kasih telah memperkenalkan saya kepada tac!
Jonathon Reinhart

Terima kasih juga kepada @ StéphaneChazelas untuk hasil printfedit yang elegan (saya awalnya memposting yang jelek echo -n)
steeldriver

1
Jelas lebih sederhana:printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Isaac

17

Jika Anda ingin menggunakan hanya shell ( zsh, ksh93, bash), inilah cara lain:

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

Atau di shell tua polos:

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

12

Mudah dengan Perl, dengan demikian:

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

6
Dapat dibuat lebih ringkas:perl -F'\.' -lane '$,=".";print reverse @F'
Joseph R.

6

Untuk menyelesaikannya, Ruby:

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

Yang juga mendukung 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

Anda bisa mengeluarkan "wajib" dari skrip:ruby -r ipaddr -e 'puts ...'
glenn jackman

5

Melalui 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

Itu membalikkan format alamat IPv4 apa pun.

Contoh:

$ 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
Ini adalah solusi tercepat! 45k IP dikonversi hanya dalam 0,794s.
Petr Javorik

4

Menggunakan perpustakaan standar Python :

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

1
Ini ada di pustaka 3,5 standar dan dijadwalkan akan dirilis September 2015. Dari skrip yang dapat Anda lakukan: python3.5 -c "import ipaddress; ipaddress.ip_address('192.168.1.1').reverse_pointer"(semua dalam satu baris)
Anthon

3

Dengan zsh:

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

Itu adalah bendera ekspansi variabel:

  • s:.:: s siap.
  • Oa: Sebaliknya o rder yang satu RRay
  • j:.:: j onin.

3

Kemungkinan lain adalah menggunakan alat baris perintah "gali" dengan sakelar "-x".

Ini sebenarnya melakukan permintaan pada entri PTR, tetapi jika Anda memfilter pada "PTR" itu akan menampilkan satu baris komentar (permintaan) dan mungkin beberapa balasan.

Menggunakan "menggali" bisa berguna untuk penulisan cepat nama PTR, tanpa harus menulis skrip kecil. Terutama jika Anda membutuhkannya secara interaktif (untuk memotong dan menempelkan hasilnya). Ini bekerja pada IPv6 juga.


2

Jika Anda ingin bekerja dengan IPv6 juga, Anda dapat menggunakannya dig -x.

Sebagai contoh:

$ 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

Dengan Python

 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
Atau lebih idiomatis, "{}.in-addr.arpa".format(".".join(reversed(a.split("."))))dalam 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

Dengan cara ini Anda bisa mengetikkan alamat dan menekan return untuk hasil Anda.


1

Dengan hostperintah dari dnsutils:

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

Ini hanya berfungsi untuk alamat yang dapat Anda cari di DNS Anda. Jika Anda mencoba alamat yang tidak dikenal, Anda akan mendapatkan pesan kesalahan (yang mencakup alamat balik tetapi perlu postprocessing yang sedikit berbeda).
Alexander Remesch

1

Dengan asumsi var berisi ip: ip=192.168.2.1. Jika nilai perlu diberikan ke variabel baru, cukup lampirkan semua solusi di dalamnya $()dan tetapkan itu ke var rr=$(...).

Beberapa solusi mungkin:

Sederhana : printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Kebanyakan kerang : IFS=. eval 'set -- $ip'; echo "$4.$3.$2.$1.in-addr.arpa"
Beberapa kerang : 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

Kedua solusi menggali dan host bekerja dengan 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

Alternatif yang lebih pendek untuk jawaban mattbianco dengan lebih sedikit alat, tetapi menggunakan pcregrep bisa:

$ 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.

0

Gunakan satu baris shell berikut:

echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.