Если у нас есть эта строка ( IP-адрес ):192.168.1.1
Как я могу извлечь ( форму обратной записи DNS ) из этой строки, чтобы она отображалась как 1.1.168.192.in-addr.arpa
сценарий оболочки?
Если у нас есть эта строка ( IP-адрес ):192.168.1.1
Как я могу извлечь ( форму обратной записи DNS ) из этой строки, чтобы она отображалась как 1.1.168.192.in-addr.arpa
сценарий оболочки?
Ответы:
Вы можете сделать это с 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="."}
.
Только для значения любопытства ... используя 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
tac
!
printf
редактирование (я изначально разместил некрасиво echo -n
)
printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Если вы хотите использовать только оболочку ( 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."; }
Легко с Perl, таким образом:
$ echo 192.168.1.1|perl -nle 'print join ".",reverse(split /\./,$_)'
1.1.168.192
perl -F'\.' -lane '$,=".";print reverse @F'
Чтобы округлить это, Руби:
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 ...'
Через 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
Используя стандартную библиотеку 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"
(все в одной строке)
С 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 в виде rrayj:.:
: j oin on.
Другая возможность - использовать инструмент командной строки dig с ключом -x.
На самом деле он выполняет запрос к записи PTR, но если вы фильтруете по «PTR», он покажет вам одну закомментированную строку (запрос) и, возможно, несколько ответов.
Использование «копать» может быть удобно для быстрого написания имени PTR, без необходимости писать небольшой скрипт. Особенно, если вам это нужно в интерактивном режиме (чтобы вырезать и вставить результат). Он работает и на IPv6.
Если вы хотите, чтобы он работал и с 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.
В питоне
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("."))))
в Python2.7
С host
командой от dnsutils
:
$ host -t ptr 192.168.1.1 | cut -d' ' -f 2
1.1.168.192.in-addr.arpa.
Предполагая вар содержит 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."
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"))'
dig : dig -x "$ip" | awk -F '[; \t]+' '/^;.*PTR$/{print($2)}'
host: host -t ptr 192.168.2.1 | cut -d' ' -f2
Решения dig и host работают с 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
Более короткая альтернатива ответу 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.