IP adresi geriye doğru nasıl okunur?


Yanıtlar:


29

AWK ile yapabilirsiniz . Bunu yapmanın daha güzel yolları var, ama bence en basit olanı bu.

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

Bu, IP adresinin sırasını tersine çevirecektir.

Mikel'in önerdiği gibi birkaç tuş vuruşunu kaydetmek için üst ifadeyi daha da kısaltabiliriz:

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

VEYA

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

VEYA

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

AWK oldukça esnektir. :)


Birkaç tuş vuruşunu kaydetmek istiyorsanız, -F .eşdeğer olmalıdır BEGIN{FS="."}.
Mikel

33

Sadece merak değeri için ... kullanarak tacGNU coreutils gelen: değişken verilen ipformda 192.168.1.1sonra

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

yani

$ 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 Bu kesinlikle benim en sevdiğim cevap. Beni tanıştırdığın için teşekkürler tac!
Jonathon Reinhart

Teşekkürler ayrıca zarif printfdüzenleme için @ StéphaneChazelas'a da (başlangıçta çirkin bir şey gönderdim echo -n)
steeldriver

1
Açıkça daha basit:printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Isaac

17

Eğer (kabuk sadece kullanmak istiyorsanız zsh, ksh93, bash), burada başka bir yol:

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

Veya düz eski kabukta:

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

12

Perl ile kolayca:

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

6
Daha da kompakt hale getirilebilir:perl -F'\.' -lane '$,=".";print reverse @F'
Joseph R.

6

Yuvarlamak için Ruby:

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

Ayrıca IPv6'yı da destekler

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

Sen senaryodan "gerektirir" alabilir:ruby -r ipaddr -e 'puts ...'
glenn jackman

5

GNU aracılığıyla 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

Herhangi bir IPv4 adresi biçimini tersine çevirir.

Misal:

$ 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
Bu en hızlı çözüm! 45k IP sadece 0.794'lerde dönüştürüldü.
Petr Javorik

4

Python'un standart kütüphanesini kullanarak :

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

1
Bu 3.5 standart kütüphanede ve Eylül 2015'te yayınlanması planlanıyor. Bir senaryodan şunları yapabilirsiniz: python3.5 -c "import ipaddress; ipaddress.ip_address('192.168.1.1').reverse_pointer"(hepsi bir satırda)
Anthon

3

İle zsh:

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

Bunlar değişken genişleme bayraklarıdır:

  • s:.:: s plit on.
  • Oa: Ters O order bir rray
  • j:.:: j oin açık.

3

Başka bir olasılık da "dig" komut satırı aracını "-x" anahtarıyla kullanmaktır.

Aslında PTR girişinde bir istek yapar, ancak "PTR" üzerinde filtre yaparsanız size bir yorum satırı (istek) ve belki bazı cevaplar gösterecektir.

"Dig" kullanmak, küçük bir komut dosyası yazmak zorunda kalmadan PTR adının hızlı bir şekilde yazılması için kullanışlı olabilir. Özellikle etkileşimli olarak ihtiyacınız varsa (sonucu kesmek ve yapıştırmak için). IPv6 üzerinde de çalışır.


2

IPv6 ile de çalışmasını istiyorsanız kullanabilirsiniz dig -x.

Örneğin:

$ 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

Python bölgesinde

 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
Veya daha "{}.in-addr.arpa".format(".".join(reversed(a.split("."))))aptalca , Python2.7'de
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

Bu şekilde bir adres yazabilir ve sonucunuz için geri dönüşe basabilirsiniz.


1

İle hostgelen komutu dnsutils:

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

Bu yalnızca DNS'inizde arayabileceğiniz adresler için geçerlidir. Bilinmeyen bir adres denerseniz bir hata mesajı alırsınız (bunun ters adresi içerir, ancak biraz farklı işlem sonrası gerekir).
Alexander Remesch

1

Bir değişkenin ip: içerdiğini varsayarsak ip=192.168.2.1. Değerin yeni bir değişkene verilmesi gerekiyorsa, içine herhangi bir çözüm ekleyin $()ve bunu var rr=$(...).

Bazı çözümler mümkündür:

En basit : printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Çoğu kabuklar : IFS=. eval 'set -- $ip'; echo "$4.$3.$2.$1.in-addr.arpa"
Bazı kabuklar : 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

Hem dig hem de host çözümleri IPv6 ile çalışır.


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

Daha az araçla mattbianco'nun cevabına daha kısa bir alternatif , ancak pcregrep kullanmak şunlar olabilir:

$ 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

Aşağıdaki bir satır kabuğunu kullanın:

echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -
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.