Как прочитать 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

Только для значения любопытства ... используя tacот GNU 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 ...'
слово

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
Это самое быстрое решение! 45 тыс. 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 PLIT на.
  • Oa: Обратный о rder в виде rray
  • j:.:: j oin on.

3

Другая возможность - использовать инструмент командной строки dig с ключом -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

В питоне

 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. Если значение должно быть передано новой переменной, просто заключите любое решение внутри $()и присвойте его переменной 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

Решения dig и host работают с 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.