Jika kami memiliki string ini ( alamat IP ):192.168.1.1
Bagaimana saya bisa mendapatkan ( bentuk catatan balik DNS ) dari string ini, sehingga akan ditampilkan seperti 1.1.168.192.in-addr.arpamenggunakan skrip shell?
Jika kami memiliki string ini ( alamat IP ):192.168.1.1
Bagaimana saya bisa mendapatkan ( bentuk catatan balik DNS ) dari string ini, sehingga akan ditampilkan seperti 1.1.168.192.in-addr.arpamenggunakan skrip shell?
Jawaban:
Anda dapat melakukannya dengan AWK . Ada cara yang lebih baik untuk melakukannya, tetapi ini adalah yang paling sederhana, saya pikir.
echo '192.168.1.1' | awk 'BEGIN{FS="."}{print $4"."$3"."$2"."$1".in-addr.arpa"}'
Ini akan membalik urutan alamat IP.
Hanya untuk menghemat beberapa penekanan tombol, seperti yang disarankan Mikel, kita dapat lebih mempersingkat pernyataan atas:
echo '192.168.1.1' | awk -F . '{print $4"."$3"."$2"."$1".in-addr.arpa"}'
ATAU
echo '192.168.1.1' | awk -F. '{print $4"."$3"."$2"."$1".in-addr.arpa"}'
ATAU
echo '192.168.1.1' | awk -F. -vOFS=. '{print $4,$3,$2,$1,"in-addr.arpa"}'
AWK cukup fleksibel. :)
-F .harus sama dengan BEGIN{FS="."}.
Hanya untuk nilai rasa ingin tahu ... menggunakan tacdari coreutils GNU: diberikan variabel ipdalam bentuk 192.168.1.1kemudian
$(printf %s "$ip." | tac -s.)in-addr.arpa
yaitu
$ ip=192.168.1.1
$ rr=$(printf %s "$ip." | tac -s.)in-addr.arpa
$ echo "$rr"
1.1.168.192.in-addr.arpa
tac!
printfedit yang elegan (saya awalnya memposting yang jelek echo -n)
printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Mudah dengan Perl, dengan demikian:
$ echo 192.168.1.1|perl -nle 'print join ".",reverse(split /\./,$_)'
1.1.168.192
perl -F'\.' -lane '$,=".";print reverse @F'
Untuk menyelesaikannya, Ruby:
ruby -r ipaddr -e 'puts IPAddr.new(ARGV.first).reverse' 192.168.1.1
Yang juga mendukung 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 ...'
Melalui 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
Itu membalikkan format alamat IPv4 apa pun.
Contoh:
$ 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
Menggunakan perpustakaan standar 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"(semua dalam satu baris)
Dengan zsh:
$ ip=192.168.1.1
$ echo ${(j:.:)${(s:.:Oa)ip}}.in-addr.arpa
1.1.168.192.in-addr.arpa
Itu adalah bendera ekspansi variabel:
s:.:: s siap.Oa: Sebaliknya o rder yang satu RRayj:.:: j onin.Kemungkinan lain adalah menggunakan alat baris perintah "gali" dengan sakelar "-x".
Ini sebenarnya melakukan permintaan pada entri PTR, tetapi jika Anda memfilter pada "PTR" itu akan menampilkan satu baris komentar (permintaan) dan mungkin beberapa balasan.
Menggunakan "menggali" bisa berguna untuk penulisan cepat nama PTR, tanpa harus menulis skrip kecil. Terutama jika Anda membutuhkannya secara interaktif (untuk memotong dan menempelkan hasilnya). Ini bekerja pada IPv6 juga.
Jika Anda ingin bekerja dengan IPv6 juga, Anda dapat menggunakannya dig -x.
Sebagai contoh:
$ 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.
Dengan 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("."))))dalam Python2.7
Dengan hostperintah dari dnsutils:
$ host -t ptr 192.168.1.1 | cut -d' ' -f 2
1.1.168.192.in-addr.arpa.
Dengan asumsi var berisi ip: ip=192.168.2.1. Jika nilai perlu diberikan ke variabel baru, cukup lampirkan semua solusi di dalamnya $()dan tetapkan itu ke var rr=$(...).
Beberapa solusi mungkin:
Sederhana : printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Kebanyakan kerang : IFS=. eval 'set -- $ip'; echo "$4.$3.$2.$1.in-addr.arpa"
Beberapa kerang : 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"))'
penggalian : dig -x "$ip" | awk -F '[; \t]+' '/^;.*PTR$/{print($2)}'
tuan rumah: host -t ptr 192.168.2.1 | cut -d' ' -f2
Kedua solusi menggali dan host bekerja dengan 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
Alternatif yang lebih pendek untuk jawaban mattbianco dengan lebih sedikit alat, tetapi menggunakan pcregrep bisa:
$ 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.
Gunakan satu baris shell berikut:
echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -