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?

Networker
sumber
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. :)

Neven
sumber
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
Steeldriver
sumber
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."; }
Mikel
sumber
12

Mudah dengan Perl, dengan demikian:

$ echo 192.168.1.1|perl -nle 'print join ".",reverse(split /\./,$_)'
1.1.168.192
JRFerguson
sumber
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
Mat
sumber
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
Avinash Raj
sumber
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'
Josh Lee
sumber
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.
Stéphane Chazelas
sumber
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.

Pablo Saratxaga
sumber
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.
MattBianco
sumber
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'
c4f4t0r
sumber
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
mikeserv
sumber
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.

uwotm8
sumber
1

Dengan hostperintah dari dnsutils:

$ host -t ptr 192.168.1.1 | cut -d' ' -f 2
1.1.168.192.in-addr.arpa.
cuonglm
sumber
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.

Ishak
sumber
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
Lukas Gottschall
sumber
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.
mback2k
sumber
0

Gunakan satu baris shell berikut:

echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -
Hongbo Liu
sumber