以bash方式在Linux上以编程方式发现公共IP

时间:2012-05-06 05:15:48

标签: bash networking ip

我找到了一篇能满足我需要的帖子,但是在Windows上:

Discovering public IP programmatically

> tracert -d www.yahoo.com

`Tracing route to www-real.wa1.b.yahoo.com [69.147.76.15]
over a maximum of 30 hops:`

1    <1 ms    <1 ms    <1 ms  192.168.14.203
2     *        *        *     Request timed out.
3     8 ms     8 ms     9 ms  68.85.228.121
4     8 ms     8 ms     9 ms  68.86.165.234
5    10 ms     9 ms     9 ms  68.86.165.237
6    11 ms    10 ms    10 ms  68.86.165.242

The 68.85.228.121 is a Comcast (my provider) router. We can ping that:

  

ping -r 9 68.85.228.121 -n 1

Pinging 68.85.228.121 with 32 bytes of data:

Reply from 68.85.228.121: bytes=32 time=10ms TTL=253 Route: 66.176.38.51 ->

68.85.228.121 ->

68.85.228.121 ->

192.168.14.203

Voila! The 66.176.38.51 is my public IP.

这个(第三个)答案显示了获取我的ISP的IP然后使用ping来获取我的IP的方法。

它在Linux上无法修改。 Traceroute不是tracert,而是因为它的输出是不可预测的,我不知道如何解析它。

我到目前为止

IP="$(traceroute -d www.yahoo.com | grep ' 2 ' | sed -e 's/.*(\(.*\)).*/\1/')"

但是grep是(很差)硬编码的。我没有看到如何在示例中使用ping。

任何意见都会受到赞赏。

5 个答案:

答案 0 :(得分:4)

就个人而言,我会运行这个命令:

wget -qO- whatismyip.org

答案 1 :(得分:0)

这不是一个可靠的解决方案,这样做的一种被动方式是编写一个脚本来拉取自己路由器的“WAN”状态页面。你可以根据需要多次这样做,没有人会抱怨过度探测。

答案 2 :(得分:0)

好吧,我知道这是一个旧帖子,但是这个帖子向我揭示了一些东西,并将它与我已经学到的东西相结合,我想我已经找到了一个可靠的解决方案。

你想要的grep是:

grep -m 1 -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

我个人寻找外部IP的解决方案曾经是:

curl icanhazip.com

现在是:

ISP=`traceroute -M 2 -m 2 8.8.8.8 | grep -m 1 -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'` | ping -R -c 1 -t 1 -s 1 $ISP | grep RR | grep -m 1 -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' > .extIP

然后

cat .extIP

玩得开心!

答案 3 :(得分:0)

我刚刚将@pizza所说的内容与this回答结合起来,并制作了以下工作脚本。它不像使用traceroute那样好,但它的复杂程度要低得多。

   #!/bin/bash
   content="$(wget http://checkip.dyndns.org/ -q -O -)"
   myip="$(<<< "$content" sed -e 's/.*Current IP Address: //' -e 's/<.*//')"
   echo "myip = [${myip}]"

wget命令检索为我的IP询问dyndns的结果。然后,sed在IP地址dyndns返回之前和之后切断所有内容。

如其他地方所述,dyndns这样的网站可能会阻止此类请求过于频繁,但由于您的知识产权在大多数情况下至少应在会话期间保持不变,如果不是很多天,则不应该有必要经常运行这个脚本。

答案 4 :(得分:0)

如果您想要的是简单性,并且您不介意依赖其他服务器(或服务)尝试:

dig +short myip.opendns.com @resolver1.opendns.com

这只会吐出你的地址

,或者

#!/bin/bash
myip="$(dig +short myip.opendns.com @resolver1.opendns.com)"
echo "myip = [${myip}]"