Якщо у нас є цей рядок ( 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="."}.
Тільки для значення цікавості ... використовуючи 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
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 плит на.Oa: Зворотний про rder в вигляді rrayj:.:: j oin на.Інша можливість - використовувати інструмент командного рядка "копати" за допомогою перемикача "-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.
У 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'
"{}.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. Якщо значення потрібно надати новій змінній, просто додайте все рішення всередину $()і призначте його 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."
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 -x "$ip" | awk -F '[; \t]+' '/^;.*PTR$/{print($2)}'
господаря: host -t ptr 192.168.2.1 | cut -d' ' -f2
І рішення для копання, і хостинг працюють з 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.