Як читати IP-адресу назад?


19

Якщо у нас є цей рядок ( IP-адреса ):192.168.1.1

Як я можу отримати ( DNS-форму зворотного запису ) з цього рядка, щоб він відображався як 1.1.168.192.in-addr.arpaсценарій оболонки?


Це має бути з оболонкою?
Брайам

1
Перестаньте це робити
Майкл Мрозек

1
При такій кількості відповідей це має бути краще у codegolf;)
tkausl

@tkausl, поділіться ним там, якщо хочете :)
Networker

Відповіді:


29

Ви можете це зробити за допомогою AWK . Є приємніші способи зробити це, але я думаю, що це найпростіший.

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

Це змінить порядок IP-адреси.

Тільки щоб зберегти кілька натискань клавіш, як запропонував Мікель, ми можемо ще більше скоротити верхнє твердження:

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

АБО

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

АБО

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

AWK досить гнучка. :)


Якщо ви хочете зберегти кілька натискань клавіш, вони -F .повинні бути еквівалентні BEGIN{FS="."}.
Мікель

33

Тільки для значення цікавості ... використовуючи tacGNU coreutils: дано змінну ipу формі 192.168.1.1тоді

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

тобто

$ 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 Це тут, безумовно, моя улюблена відповідь. Дякуємо, що познайомили мене tac!
Джонатан Райнхарт

Дякую також завдяки @ StéphaneChazelas за вишукану printfредагування (спочатку я опублікував некрасиву echo -n)
steeldriver

1
Ясно простіше:printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Ісаак

17

Якщо ви хочете використовувати тільки оболонку ( zsh, ksh93, bash), ось ще один спосіб:

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

Або в звичайній старій оболонці:

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

12

Легко за допомогою Perl, таким чином:

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

6
Можна зробити ще більш компактним:perl -F'\.' -lane '$,=".";print reverse @F'
Джозеф Р.

6

Щоб закруглити її, Рубі:

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

Що також підтримує 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 ...'
glenn jackman

5

Через 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

Він обертає будь-який формат IPv4-адреси.

Приклад:

$ 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
Це найшвидше рішення! 45k IP перетворені всього за 0.794 секунди.
Петро Яворик

4

Використання стандартної бібліотеки Python :

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

1
Це в стандартній бібліотеці 3.5, і планується вийти на вересень 2015 року. Сценарій можна зробити: python3.5 -c "import ipaddress; ipaddress.ip_address('192.168.1.1').reverse_pointer"(все в одному рядку)
Anthon

3

З zsh:

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

Це прапори змінної розширення:

  • s:.:: s плит на.
  • Oa: Зворотний про rder в вигляді rray
  • j:.:: j oin на.

3

Інша можливість - використовувати інструмент командного рядка "копати" за допомогою перемикача "-x".

Він насправді робить запит на запис PTR, але якщо ви фільтруєте на "PTR", він покаже вам один коментований рядок (запит) і, можливо, деякі відповіді.

Використання "копати" може бути зручним для швидкого написання імені PTR, без необхідності писати невеликий сценарій. Особливо, якщо вам це потрібно інтерактивно (щоб вирізати та вставити результат). Він працює і на IPv6.


2

Якщо ви хочете, щоб вона працювала і з IPv6 , ви можете використовувати dig -x.

Наприклад:

$ 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

 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
Або більш ідіоматично, "{}.in-addr.arpa".format(".".join(reversed(a.split("."))))в 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

Таким чином ви можете ввести адресу та натиснути на повернення для свого результату.


1

За допомогою hostкоманди dnsutils:

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

Це працює лише для адрес, які ви можете шукати у своїй DNS. Якщо ви спробуєте невідому адресу, ви отримаєте повідомлення про помилку (яке, однак, включає зворотну адресу, але потребує дещо іншої післяобробки).
Олександр Ремеш

1

Припускаючи вар містить IP: ip=192.168.2.1. Якщо значення потрібно надати новій змінній, просто додайте все рішення всередину $()і призначте його var rr=$(...).

Можливі деякі рішення:

Найпростіші : printf 'arpa.in-addr.%s.' "$ip" | tac -s.
більшість снарядів : IFS=. eval 'set -- $ip'; echo "$4.$3.$2.$1.in-addr.arpa"
Деякі снаряди : 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

І рішення для копання, і хостинг працюють з 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

Коротка альтернатива відповіді mattbianco з меншими інструментами, але використання pcregrep може бути:

$ 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

Використовуйте наступну оболонку рядка:

echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.