¿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?

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

Neven
fuente
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
conductor de acero
fuente
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."; }
Mikel
fuente
12

Fácilmente con Perl, por lo tanto:

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

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

uwotm8
fuente
1

Con hostcomando de dnsutils:

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

Isaac
fuente
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
fuente
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.
mback2k
fuente
0

Use el siguiente shell de una línea:

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