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.arpa
usara un script de shell?
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.arpa
usara un script de shell?
Respuestas:
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. :)
-F .
debe ser equivalente a BEGIN{FS="."}
.
Solo por valor de curiosidad ... usando tac
GNU coreutils: dada una variable ip
en el formulario 192.168.1.1
entonces
$(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
tac
!
printf
edición (originalmente echo -n
printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Fácilmente con Perl, por lo tanto:
$ echo 192.168.1.1|perl -nle 'print join ".",reverse(split /\./,$_)'
1.1.168.192
perl -F'\.' -lane '$,=".";print reverse @F'
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
ruby -r ipaddr -e 'puts ...'
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
Usando la biblioteca estándar de Python :
>>> ipaddress.ip_address('192.168.1.1').reverse_pointer
'1.1.168.192.in-addr.arpa'
python3.5 -c "import ipaddress; ipaddress.ip_address('192.168.1.1').reverse_pointer"
(todo en una línea)
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 RRayj:.:
: j on.
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.
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.
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'
"{}.in-addr.arpa".format(".".join(reversed(a.split("."))))
en Python2.7
Con host
comando de dnsutils
:
$ host -t ptr 192.168.1.1 | cut -d' ' -f 2
1.1.168.192.in-addr.arpa.
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."
awk : echo "$ip" | awk -F. '{OFS=FS;print $4,$3,$2,$1,"in-addr.arpa"}'
SED : echo "$ip" | sed -E 's/([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)$/\4.\3.\2.\1.in-addr.arpa./'
SED : echo "arpa.in-addr.$ip" | sed 'y/./\n/' | sed 'G;$s/\n/./gp;h;d'
Perl : echo "$ip" | perl -F\\. -lane '$,=".";print( join(".",(reverse @F),"in-addr.arpa"))'
excavación : dig -x "$ip" | awk -F '[; \t]+' '/^;.*PTR$/{print($2)}'
de acogida: host -t ptr 192.168.2.1 | cut -d' ' -f2
Las soluciones de excavación y host funcionan con IPv6.
#!/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
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.
Use el siguiente shell de una línea:
echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -