Bu dizeye sahipsek ( IP adresi ):192.168.1.1
( DNS ters kayıt formunu ) bu dizeden nasıl türetebilirim , böylece 1.1.168.192.in-addr.arpa
bir kabuk betiği gibi gösterilecek mi?
Bu dizeye sahipsek ( IP adresi ):192.168.1.1
( DNS ters kayıt formunu ) bu dizeden nasıl türetebilirim , böylece 1.1.168.192.in-addr.arpa
bir kabuk betiği gibi gösterilecek mi?
Yanıtlar:
AWK ile yapabilirsiniz . Bunu yapmanın daha güzel yolları var, ama bence en basit olanı bu.
echo '192.168.1.1' | awk 'BEGIN{FS="."}{print $4"."$3"."$2"."$1".in-addr.arpa"}'
Bu, IP adresinin sırasını tersine çevirecektir.
Mikel'in önerdiği gibi birkaç tuş vuruşunu kaydetmek için üst ifadeyi daha da kısaltabiliriz:
echo '192.168.1.1' | awk -F . '{print $4"."$3"."$2"."$1".in-addr.arpa"}'
VEYA
echo '192.168.1.1' | awk -F. '{print $4"."$3"."$2"."$1".in-addr.arpa"}'
VEYA
echo '192.168.1.1' | awk -F. -vOFS=. '{print $4,$3,$2,$1,"in-addr.arpa"}'
AWK oldukça esnektir. :)
-F .
eşdeğer olmalıdır BEGIN{FS="."}
.
Sadece merak değeri için ... kullanarak tac
GNU coreutils gelen: değişken verilen ip
formda 192.168.1.1
sonra
$(printf %s "$ip." | tac -s.)in-addr.arpa
yani
$ 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
düzenleme için @ StéphaneChazelas'a da (başlangıçta çirkin bir şey gönderdim echo -n
)
printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Perl ile kolayca:
$ echo 192.168.1.1|perl -nle 'print join ".",reverse(split /\./,$_)'
1.1.168.192
perl -F'\.' -lane '$,=".";print reverse @F'
Yuvarlamak için Ruby:
ruby -r ipaddr -e 'puts IPAddr.new(ARGV.first).reverse' 192.168.1.1
Ayrıca IPv6'yı da destekler
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 aracılığıyla 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
Herhangi bir IPv4 adresi biçimini tersine çevirir.
Misal:
$ 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'un standart kütüphanesini kullanarak :
>>> 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"
(hepsi bir satırda)
İle zsh
:
$ ip=192.168.1.1
$ echo ${(j:.:)${(s:.:Oa)ip}}.in-addr.arpa
1.1.168.192.in-addr.arpa
Bunlar değişken genişleme bayraklarıdır:
s:.:
: s plit on.
Oa
: Ters O order bir rrayj:.:
: j oin açık.
Başka bir olasılık da "dig" komut satırı aracını "-x" anahtarıyla kullanmaktır.
Aslında PTR girişinde bir istek yapar, ancak "PTR" üzerinde filtre yaparsanız size bir yorum satırı (istek) ve belki bazı cevaplar gösterecektir.
"Dig" kullanmak, küçük bir komut dosyası yazmak zorunda kalmadan PTR adının hızlı bir şekilde yazılması için kullanışlı olabilir. Özellikle etkileşimli olarak ihtiyacınız varsa (sonucu kesmek ve yapıştırmak için). IPv6 üzerinde de çalışır.
IPv6 ile de çalışmasını istiyorsanız kullanabilirsiniz dig -x
.
Örneğin:
$ 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 bölgesinde
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("."))))
aptalca , Python2.7'de
İle host
gelen komutu dnsutils
:
$ host -t ptr 192.168.1.1 | cut -d' ' -f 2
1.1.168.192.in-addr.arpa.
Bir değişkenin ip: içerdiğini varsayarsak ip=192.168.2.1
. Değerin yeni bir değişkene verilmesi gerekiyorsa, içine herhangi bir çözüm ekleyin $()
ve bunu var rr=$(...)
.
Bazı çözümler mümkündür:
En basit : printf 'arpa.in-addr.%s.' "$ip" | tac -s.
Çoğu kabuklar : IFS=. eval 'set -- $ip'; echo "$4.$3.$2.$1.in-addr.arpa"
Bazı kabuklar : 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 : dig -x "$ip" | awk -F '[; \t]+' '/^;.*PTR$/{print($2)}'
host: host -t ptr 192.168.2.1 | cut -d' ' -f2
Hem dig hem de host çözümleri IPv6 ile çalışır.
#!/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
Daha az araçla mattbianco'nun cevabına daha kısa bir alternatif , ancak pcregrep kullanmak şunlar olabilir:
$ 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.
Aşağıdaki bir satır kabuğunu kullanın:
echo '192.168.1.1' | tr '.' '\n' | tac | paste -s -d '.' -