¿Cómo leer una dirección IP al revés?


19

Si tenemos esta cadena ( dirección IP ):192.168.1.1

¿Cómo puedo derivar el ( formulario de registro inverso DNS ) de esta cadena, para que se muestre como si se 1.1.168.192.in-addr.arpausara un script de shell?


Tiene que estar con el caparazón?
Braiam

1
Deja de hacer eso
Michael Mrozek

1
Con esta cantidad de respuestas, esto debería estar mejor en codegolf;)
tkausl

@tkausl, compártelo allí si quieres :)
Networker

Respuestas:


29

Puedes hacerlo con AWK . Hay mejores formas de hacerlo, pero creo que esta es la más simple.

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

Esto invertirá el orden de la dirección IP.

Solo para ahorrar algunas pulsaciones de teclas, como sugirió Mikel, podemos acortar aún más la declaración superior:

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

O

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

O

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

AWK es bastante flexible. :)


Si desea guardar algunas pulsaciones de teclas, -F .debe ser equivalente a BEGIN{FS="."}.
Mikel

33

Solo por valor de curiosidad ... usando tacGNU coreutils: dada una variable ipen el formulario 192.168.1.1entonces

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

es decir

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

99
+1 Esta es definitivamente mi respuesta favorita aquí. ¡Gracias por presentarme tac!
Jonathon Reinhart

Gracias también a @ StéphaneChazelas por la elegante printfedición (originalmente echo -n
publiqué

1
Claramente más simple:printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Isaac

17

Si desea utilizar sólo la cáscara ( zsh, ksh93, bash), aquí hay otra manera:

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

O en la vieja cáscara simple:

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

12

Fácilmente con Perl, por lo tanto:

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

66
Se puede hacer aún más compacto:perl -F'\.' -lane '$,=".";print reverse @F'
Joseph R.

6

Para redondear, Ruby:

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

Que también es compatible con 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

podría eliminar el "requerimiento" del guión:ruby -r ipaddr -e 'puts ...'
Glenn Jackman

5

A través de 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

Invierte cualquier formato de dirección IPv4.

Ejemplo:

$ 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
¡Esta es la solución más rápida! 45k IP convertidas en solo 0.794s.
Petr Javorik

4

Usando la biblioteca estándar de Python :

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

1
Está en la biblioteca estándar 3.5 y está programado para lanzarse en septiembre de 2015. Desde un script que puede hacer: python3.5 -c "import ipaddress; ipaddress.ip_address('192.168.1.1').reverse_pointer"(todo en una línea)
Anthon

3

Con zsh:

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

Esas son banderas de expansión variable:

  • s:.:: s plit on.
  • Oa: Inversa o rder la una RRay
  • j:.:: j on.

3

Otra posibilidad es usar la herramienta de línea de comando "cavar" con el interruptor "-x".

En realidad, hace una solicitud en la entrada PTR, pero si filtra en "PTR", le mostrará una línea comentada (la solicitud) y tal vez algunas respuestas.

Usar "cavar" puede ser útil para una escritura rápida del nombre PTR, sin tener que escribir un pequeño guión. Particularmente si lo necesita de forma interactiva (para cortar y pegar el resultado). Funciona también en IPv6.


2

Si quieres que funcione con IPv6 , puede usarlo dig -x.

Por ejemplo:

$ 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

En 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
O más idiomáticamente, "{}.in-addr.arpa".format(".".join(reversed(a.split("."))))en 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

De esta manera, puede escribir una dirección y presionar regresar para obtener su resultado.


1

Con hostcomando de dnsutils:

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

Esto solo funciona para direcciones que puede buscar en su DNS. Si prueba una dirección desconocida, recibirá un mensaje de error (que sin embargo incluye la dirección inversa pero necesita un procesamiento posterior ligeramente diferente).
Alexander Remesch

1

Suponiendo una var contiene la ip: ip=192.168.2.1. Si el valor necesita ser dado a una nueva variable, simplemente encierre cualquier solución dentro $()y asígnela a la variablerr=$(...) .

Algunas soluciones son posibles:

Más simples : printf 'arpa.in-addr.%s.' "$ip" | tac -s.
La mayoría de los proyectiles : IFS=. eval 'set -- $ip'; echo "$4.$3.$2.$1.in-addr.arpa"
Algunas conchas : 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

Las soluciones de excavación y host funcionan con 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

Una alternativa más corta a la respuesta de mattbianco con menos herramientas, pero el uso de pcregrep podría ser:

$ 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

Use el siguiente shell de una línea:

echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.