Wie lese ich eine IP-Adresse rückwärts?

19

Wenn wir diesen String haben ( IP-Adresse ):192.168.1.1

Wie kann ich das ( DNS-Reverse-Record-Formular ) aus dieser Zeichenfolge ableiten , damit es wie 1.1.168.192.in-addr.arpamit einem Shell-Skript angezeigt wird ?

Networker
quelle
Es muss mit der Schale sein?
Braiam
1
Hör auf damit
Michael Mrozek
1
Mit dieser Anzahl von Antworten sollte dies besser im Codegolf sein;)
tkausl
@ Tkausl, teilen Sie es dort, wenn Sie wollen :)
Networker

Antworten:

29

Sie können es mit AWK tun . Es gibt schönere Möglichkeiten, dies zu tun, aber ich denke, dies ist die einfachste.

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

Dadurch wird die Reihenfolge der IP-Adresse umgekehrt.

Um ein paar Tastenanschläge zu sparen, wie Mikel vorgeschlagen hat, können wir die obere Aussage weiter verkürzen:

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

ODER

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

ODER

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

AWK ist ziemlich flexibel. :)

Neven
quelle
Wenn Sie ein paar Tastatureingaben speichern möchten, -F .sollte dies gleichbedeutend sein mit BEGIN{FS="."}.
Mikel
33

Gerade für Neugier Wert ... mit tacvon coreutils GNU: Da eine Variable ipin der Form 192.168.1.1dann

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

dh

$ ip=192.168.1.1
$ rr=$(printf %s "$ip." | tac -s.)in-addr.arpa
$ echo "$rr"
1.1.168.192.in-addr.arpa
Stahlfahrer
quelle
9
+1 Dies ist definitiv meine Lieblingsantwort hier. Danke, dass du mich hier vorgestellt hast tac!
Jonathon Reinhart
Danke auch an @ StéphaneChazelas für den eleganten printfSchnitt (ich habe ursprünglich einen hässlichen gepostet echo -n)
steeldriver
1
Deutlich einfacher:printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Isaac
17

Wenn Sie nur verwenden möchten Shell ( zsh, ksh93, bash), hier ist eine andere Art und Weise:

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

Oder in einfacher alter Schale:

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

Einfach mit Perl, also:

$ echo 192.168.1.1|perl -nle 'print join ".",reverse(split /\./,$_)'
1.1.168.192
JRFerguson
quelle
6
Kann noch kompakter gemacht werden:perl -F'\.' -lane '$,=".";print reverse @F'
Joseph R.
6

Um es abzurunden, Ruby:

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

Welches auch IPv6 unterstützt

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
Matt
quelle
Sie könnten das "Erfordernis" aus dem Skript ruby -r ipaddr -e 'puts ...'
entfernen
5

Durch 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

Es kehrt jedes IPv4-Adressformat um.

Beispiel:

$ 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
quelle
1
Dies ist die schnellste Lösung! 45k IPs konvertiert in nur 0,794s.
Petr Javorik
4

Verwenden der Standardbibliothek von Python :

>>> ipaddress.ip_address('192.168.1.1').reverse_pointer
'1.1.168.192.in-addr.arpa'
Josh Lee
quelle
1
Dies befindet sich in der 3.5-Standardbibliothek und soll im September 2015 veröffentlicht werden. Mit einem Skript können Sie Folgendes tun: python3.5 -c "import ipaddress; ipaddress.ip_address('192.168.1.1').reverse_pointer"(alle in einer Zeile)
Anthon,
3

Mit zsh:

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

Das sind variable Erweiterungsflags:

  • s:.:: s plit auf.
  • Oa: Reverse o rder der ein rray
  • j:.:: J oin auf.
Stéphane Chazelas
quelle
3

Eine andere Möglichkeit ist die Verwendung des Befehlszeilentools "dig" mit der Option "-x".

Es führt tatsächlich eine Anfrage für den PTR-Eintrag durch, aber wenn Sie nach "PTR" filtern, werden eine kommentierte Zeile (die Anfrage) und möglicherweise einige Antworten angezeigt.

Die Verwendung von "dig" kann nützlich sein, um den PTR-Namen schnell zu schreiben, ohne ein kleines Skript schreiben zu müssen. Besonders, wenn Sie es interaktiv benötigen (um das Ergebnis auszuschneiden und einzufügen). Es funktioniert auch auf IPv6.

Pablo Saratxaga
quelle
2

Wenn Sie möchten, dass es auch mit IPv6 funktioniert , können Sie verwenden dig -x.

Beispielsweise:

$ 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
quelle
2

In 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
quelle
2
Oder idiomatischer, "{}.in-addr.arpa".format(".".join(reversed(a.split("."))))in Python 2.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
quelle
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

Auf diese Weise können Sie eine Adresse eingeben und die Eingabetaste für Ihr Ergebnis drücken.

uwotm8
quelle
1

Mit hostBefehl von dnsutils:

$ host -t ptr 192.168.1.1 | cut -d' ' -f 2
1.1.168.192.in-addr.arpa.
cuonglm
quelle
Dies funktioniert nur für Adressen, die Sie in Ihrem DNS nachschlagen können. Wenn Sie es mit einer unbekannten Adresse versuchen, erhalten Sie eine Fehlermeldung (die die umgekehrte Adresse enthält, jedoch eine etwas andere Nachbearbeitung erfordert).
Alexander Remesch
1

Angenommen, eine Variable enthält die IP: ip=192.168.2.1 . Wenn der Wert einer neuen Variablen $()zugewiesen werden muss, schließen Sie einfach eine beliebige Lösung ein und weisen Sie diese der Variablen zu rr=$(...).

Einige Lösungen sind möglich:

Einfachstes Die : printf 'arpa.in-addr.%s.' "$ip" | tac -s.
meisten Schalen : IFS=. eval 'set -- $ip'; echo "$4.$3.$2.$1.in-addr.arpa"
Einige Schalen : 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

Sowohl dig- als auch host-Lösungen funktionieren mit IPv6.

Isaac
quelle
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
quelle
0

Eine kürzere Alternative zu mattbiancos Antwort mit weniger Werkzeugen, aber mit pcregrep, könnte sein:

$ 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
quelle
0

Verwenden Sie folgende einzeilige Shell:

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