IP 주소를 거꾸로 읽는 방법?


19

이 문자열 ( IP address )이있는 경우 :192.168.1.1

이 문자열에서 ( DNS reverse record form )을 어떻게 파생시킬 수 1.1.168.192.in-addr.arpa있습니까? 그래서 쉘 스크립트를 사용하는 것처럼 보 일까요?


껍질과 함께 있어야합니까?
Braiam

1
그만해
Michael Mrozek

1
이 정도의 답변으로 이것은 codegolf에 더 좋을 것입니다;)
tkausl

@tkausl, 원한다면 공유하십시오 :)
Networker

답변:


29

AWK로 할 수 있습니다 . 더 좋은 방법이 있지만 이것이 가장 간단하다고 생각합니다.

echo '192.168.1.1' | awk 'BEGIN{FS="."}{print $4"."$3"."$2"."$1".in-addr.arpa"}'

IP 주소 순서가 반대로됩니다.

Mikel이 제안했듯이 몇 번의 키 입력을 저장하기 위해 위의 진술을 더 단축 할 수 있습니다.

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="."}.
Mikel

33

그냥 호기심 값 ... 사용하는 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

9
+1 이것은 내가 가장 좋아하는 대답입니다. 소개해 주셔서 감사합니다 tac!
Jonathon Reinhart

감사 인해 우아한에 대한 StéphaneChazelas @에 또한 printf편집 (I 원래 못생긴 게시 echo -n)
steeldriver

1
printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Isaac

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."; }

12

따라서 Perl을 사용하면 쉽게 :

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

6
더 컴팩트하게 만들 수 있습니다.perl -F'\.' -lane '$,=".";print reverse @F'
Joseph R.

6

반올림하기 위해 Ruby :

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 ...'
글렌 잭맨

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
이것이 가장 빠른 솔루션입니다! 45k IP는 0.794 초만에 변환되었습니다.
Petr Javorik

4

파이썬의 표준 라이브러리 사용 :

>>> ipaddress.ip_address('192.168.1.1').reverse_pointer
'1.1.168.192.in-addr.arpa'

1
이는 3.5 표준 라이브러리에 있고 당신이 할 수있는 스크립트 가입일 September 2015 년 출시 예정 : python3.5 -c "import ipaddress; ipaddress.ip_address('192.168.1.1').reverse_pointer"(모두 한 줄에)
안톤

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 on.
  • Oa: 역방향 O RDER rray
  • j:.:: J 에 OIN.

3

또 다른 가능성은 "-x"스위치와 함께 "dig"명령 행 도구를 사용하는 것입니다.

실제로 PTR 항목에 대한 요청을 수행하지만 "PTR"을 필터링하면 주석 처리 된 한 줄 (요청)과 일부 응답이 표시됩니다.

"dig"를 사용하면 작은 스크립트를 작성하지 않고도 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.

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'

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

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

이 방법으로 주소를 입력하고 결과에 대해 return 키를 누를 수 있습니다.


1

host명령으로 dnsutils:

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

이것은 DNS에서 조회 할 수있는 주소에서만 작동합니다. 알 수없는 주소를 시도하면 오류 메시지 (역 주소는 포함되지만 약간 다른 후 처리가 필요함)가 표시됩니다.
Alexander Remesch

1

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

발굴 및 호스트 솔루션은 모두 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.

0

다음 한 줄 쉘을 사용하십시오.

echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.