Как прочитать 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 довольно гибкий. :)

Neven
источник
Если вы хотите сохранить несколько нажатий клавиш, -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
steeldriver
источник
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."; }
Mikel
источник
12

Легко с Perl, таким образом:

$ echo 192.168.1.1|perl -nle 'print join ".",reverse(split /\./,$_)'
1.1.168.192
JRFerguson
источник
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
Matt
источник
Вы можете убрать 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.
MattBianco
источник
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'
c4f4t0r
источник
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
mikeserv
источник
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

Таким образом, вы можете ввести адрес и нажать клавишу возврата для вашего результата.

uwotm8
источник
1

С hostкомандой от dnsutils:

$ host -t ptr 192.168.1.1 | cut -d' ' -f 2
1.1.168.192.in-addr.arpa.
cuonglm
источник
Это работает только для адресов, которые вы можете искать в вашем 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.
mback2k
источник
0

Используйте следующую однострочную оболочку:

echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -
Хунбо Лю
источник