我找到了一篇能满足我需要的帖子,但是在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。
任何意见都会受到赞赏。
答案 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}]"