Nếu chúng ta có chuỗi này ( địa chỉ IP ):192.168.1.1
Làm cách nào tôi có thể lấy được ( mẫu bản ghi đảo ngược DNS ) từ chuỗi này, vì vậy nó sẽ được hiển thị như 1.1.168.192.in-addr.arpa
sử dụng tập lệnh shell?
Nếu chúng ta có chuỗi này ( địa chỉ IP ):192.168.1.1
Làm cách nào tôi có thể lấy được ( mẫu bản ghi đảo ngược DNS ) từ chuỗi này, vì vậy nó sẽ được hiển thị như 1.1.168.192.in-addr.arpa
sử dụng tập lệnh shell?
Câu trả lời:
Bạn có thể làm điều đó với AWK . Có nhiều cách đẹp hơn để làm điều đó, nhưng đây là cách đơn giản nhất, tôi nghĩ vậy.
echo '192.168.1.1' | awk 'BEGIN{FS="."}{print $4"."$3"."$2"."$1".in-addr.arpa"}'
Điều này sẽ đảo ngược thứ tự của địa chỉ IP.
Chỉ cần lưu một vài tổ hợp phím, như Mikel đề xuất, chúng ta có thể rút ngắn hơn nữa tuyên bố trên:
echo '192.168.1.1' | awk -F . '{print $4"."$3"."$2"."$1".in-addr.arpa"}'
HOẶC LÀ
echo '192.168.1.1' | awk -F. '{print $4"."$3"."$2"."$1".in-addr.arpa"}'
HOẶC LÀ
echo '192.168.1.1' | awk -F. -vOFS=. '{print $4,$3,$2,$1,"in-addr.arpa"}'
AWK khá linh hoạt. :)
-F .
nên tương đương với BEGIN{FS="."}
.
Chỉ dành cho giá trị tò mò ... sử dụng tac
từ lõi GNU: được cung cấp một biến ip
ở dạng 192.168.1.1
sau đó
$(printf %s "$ip." | tac -s.)in-addr.arpa
I E
$ 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
chỉnh sửa thanh lịch (ban đầu tôi đã đăng một cái xấu xí echo -n
)
printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Dễ dàng với Perl, do đó:
$ echo 192.168.1.1|perl -nle 'print join ".",reverse(split /\./,$_)'
1.1.168.192
perl -F'\.' -lane '$,=".";print reverse @F'
Để làm tròn nó, Ruby:
ruby -r ipaddr -e 'puts IPAddr.new(ARGV.first).reverse' 192.168.1.1
Cái nào cũng hỗ trợ 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 ...'
Thông qua 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
Nó đảo ngược mọi định dạng địa chỉ IPv4.
Thí dụ:
$ 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
Sử dụng thư viện chuẩn của 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"
(tất cả trên một dòng)
Với zsh
:
$ ip=192.168.1.1
$ echo ${(j:.:)${(s:.:Oa)ip}}.in-addr.arpa
1.1.168.192.in-addr.arpa
Đó là các cờ mở rộng biến:
s:.:
: s plit trên.
Oa
: Ngược o rder các một rrayj:.:
: j oin vào.
Một khả năng khác là sử dụng công cụ dòng lệnh "đào" với công tắc "-x".
Nó thực sự thực hiện một yêu cầu trên mục PTR, nhưng nếu bạn lọc trên "PTR", nó sẽ hiển thị cho bạn một dòng nhận xét (yêu cầu) và có thể một số câu trả lời.
Sử dụng "đào" có thể thuận tiện cho việc viết nhanh tên PTR, mà không phải viết một tập lệnh nhỏ. Đặc biệt nếu bạn cần nó một cách tương tác (để cắt và dán kết quả). Nó cũng hoạt động trên IPv6.
Nếu bạn muốn nó hoạt động với IPv6 , bạn có thể sử dụng dig -x
.
Ví dụ:
$ 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.
Trong 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("."))))
trong Python2.7
Với host
lệnh từ dnsutils
:
$ host -t ptr 192.168.1.1 | cut -d' ' -f 2
1.1.168.192.in-addr.arpa.
Giả sử một var chứa ip : ip=192.168.2.1
. Nếu giá trị cần được cung cấp cho một biến mới, chỉ cần đặt bất kỳ giải pháp nào bên trong $()
và gán giá trị đó cho varrr=$(...)
.
Một số giải pháp có thể:
Đơn giản nhất : printf 'arpa.in-addr.%s.' "$ip" | tac -s.
hầu hết các vỏ : IFS=. eval 'set -- $ip'; echo "$4.$3.$2.$1.in-addr.arpa"
Một số vỏ : 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"))'
đào : dig -x "$ip" | awk -F '[; \t]+' '/^;.*PTR$/{print($2)}'
host: host -t ptr 192.168.2.1 | cut -d' ' -f2
Cả hai giải pháp đào và máy chủ đều hoạt động với 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
Một thay thế ngắn hơn cho câu trả lời của mattbianco với ít công cụ hơn, nhưng sử dụng pcregrep có thể là:
$ 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.
Sử dụng một dòng vỏ sau:
echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -