如何反向读取IP地址?

Nid*_*dal 19 shell text-processing

如果我们有这个字符串(IP 地址):192.168.1.1

我怎样才能从这个字符串中导出(DNS 反向记录形式),所以它会像1.1.168.192.in-addr.arpa使用 shell 脚本一样显示?

ste*_*ver 34

只是为了好奇价值......使用tac来自 GNU coreutils:给定一个变量ip192.168.1.1然后

$(printf %s "$ip." | tac -s.)in-addr.arpa
Run Code Online (Sandbox Code Playgroud)

IE

$ ip=192.168.1.1
$ rr=$(printf %s "$ip." | tac -s.)in-addr.arpa
$ echo "$rr"
1.1.168.192.in-addr.arpa
Run Code Online (Sandbox Code Playgroud)

  • +1 这绝对是我最喜欢的答案。感谢您向我介绍`tac`! (9认同)
  • 显然更简单:`printf 'arpa.in-addr.%s.' "$ip" | tac -s.` (2认同)

Nev*_*ven 31

你可以用AWK做到这一点。有更好的方法可以做到,但我认为这是最简单的。

echo '192.168.1.1' | awk 'BEGIN{FS="."}{print $4"."$3"."$2"."$1".in-addr.arpa"}'
Run Code Online (Sandbox Code Playgroud)

这将颠倒 IP 地址的顺序。

正如 Mikel 建议的那样,为了节省一些击键次数,我们可以进一步缩短上面的语句:

echo '192.168.1.1' | awk -F . '{print $4"."$3"."$2"."$1".in-addr.arpa"}'
Run Code Online (Sandbox Code Playgroud)

或者

echo '192.168.1.1' | awk -F. '{print $4"."$3"."$2"."$1".in-addr.arpa"}'
Run Code Online (Sandbox Code Playgroud)

或者

echo '192.168.1.1' | awk -F. -vOFS=. '{print $4,$3,$2,$1,"in-addr.arpa"}'
Run Code Online (Sandbox Code Playgroud)

AWK 非常灵活。:)


Mik*_*kel 18

如果您只想使用 shell ( 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"
Run Code Online (Sandbox Code Playgroud)

或者在普通的旧外壳中:

echo '192.168.1.1' | { IFS=. read w x y z; echo "$z.$y.$w.$x.in-addr.arpa."; }
Run Code Online (Sandbox Code Playgroud)


JRF*_*son 13

使用 Perl 很容易,因此:

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

  • 可以做得更紧凑:`perl -F'\.' -lane '$,=".";打印反向@F'` (6认同)

Mat*_*att 7

总结一下,Ruby:

ruby -r ipaddr -e 'puts IPAddr.new(ARGV.first).reverse' 192.168.1.1
Run Code Online (Sandbox Code Playgroud)

它还支持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
Run Code Online (Sandbox Code Playgroud)


Avi*_*Raj 6

通过 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
Run Code Online (Sandbox Code Playgroud)

它反转任何 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
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 5

zsh

$ ip=192.168.1.1
$ echo ${(j:.:)${(s:.:Oa)ip}}.in-addr.arpa
1.1.168.192.in-addr.arpa
Run Code Online (Sandbox Code Playgroud)

这些是变量扩展标志:

  • s:.:小号上PLIT.
  • Oa:反向Ó刻申的一个rray
  • j:.:Ĵ OIN上.