Làm thế nào để đọc một địa chỉ IP ngược?


19

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.arpasử dụng tập lệnh shell?


Nó phải được với vỏ?
Braiam

1
Dừng làm điều đó
Michael Mrozek

1
Với số lượng câu trả lời này tốt hơn nên có trong codegolf;)
tkausl

@tkausl, chia sẻ nó ở đó nếu bạn muốn :)
Networker

Câu trả lời:


29

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. :)


Nếu bạn muốn lưu một vài tổ hợp phím, -F .nên tương đương với BEGIN{FS="."}.
Mikel

33

Chỉ dành cho giá trị tò mò ... sử dụng tactừ lõi GNU: được cung cấp một biến ipở dạng 192.168.1.1sau đó

$(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

9
+1 Đây chắc chắn là câu trả lời yêu thích của tôi ở đây. Cảm ơn đã giới thiệu cho tôi tac!
Jonathon Reinhart

Cũng xin cảm ơn @ StéphaneChazelas vì bản printfchỉnh sửa thanh lịch (ban đầu tôi đã đăng một cái xấu xí echo -n)
Steeldo

1
Rõ ràng đơn giản hơn:printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Isaac

17

Nếu bạn muốn sử dụng chỉ shell ( zsh, ksh93, bash), đây là một cách khác:

IFS=. read w x y z <<<'192.168.1.1'
printf '%d.%d.%d.%d.in-addr.arpa.' "$z" "$y" "$x" "$w"

Hoặc trong vỏ cũ đơn giản:

echo '192.168.1.1' | { IFS=. read w x y z; echo "$z.$y.$w.$x.in-addr.arpa."; }

12

Dễ dàng với Perl, do đó:

$ echo 192.168.1.1|perl -nle 'print join ".",reverse(split /\./,$_)'
1.1.168.192

6
Có thể được thực hiện thậm chí còn gọn hơn:perl -F'\.' -lane '$,=".";print reverse @F'
Joseph R.

6

Để 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

bạn có thể rút "yêu cầu" ra khỏi kịch bản:ruby -r ipaddr -e 'puts ...'
glenn jackman

5

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

1
Đây là giải pháp nhanh nhất! IP 45k được chuyển đổi chỉ trong 0,794.
Petr Javorik

4

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'

1
Đây là trong thư viện tiêu chuẩn 3.5 và dự kiến ​​được phát hành vào tháng 9 năm 2015. Từ một kịch bản bạn có thể làm: python3.5 -c "import ipaddress; ipaddress.ip_address('192.168.1.1').reverse_pointer"(tất cả trên một dòng)
Anthon

3

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 rray
  • j:.:: j oin vào.

3

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.


2

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.

2

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'

2
Hoặc thành ngữ hơn, "{}.in-addr.arpa".format(".".join(reversed(a.split("."))))trong 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

Bằng cách này, bạn có thể nhập địa chỉ và nhấn return cho kết quả của mình.


1

Với hostlệnh từ dnsutils:

$ host -t ptr 192.168.1.1 | cut -d' ' -f 2
1.1.168.192.in-addr.arpa.

Điều này chỉ hoạt động cho các địa chỉ bạn có thể tra cứu trong DNS của bạn. Nếu bạn thử một địa chỉ không xác định, bạn sẽ nhận được thông báo lỗi (tuy bao gồm địa chỉ ngược nhưng cần xử lý hậu kỳ hơi khác).
Alexander Remesch

1

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."
: 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

Cả hai giải pháp đào và máy chủ đều hoạt động với 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

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.

0

Sử dụng một dòng vỏ sau:

echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.