这是我能做的最好的(仅依赖于我的 ISP):
ISP=`traceroute -M 2 -m 2 -n -q 1 8.8.8.8 | grep -m 1 -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'`
extIP=`ping -R -c 1 -t 1 -s 1 -n $ISP | grep RR | grep -m 1 -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'`
echo $extIP
或者,功能相同的东西放在一行上:
ISP=`traceroute -M 2 -m 2 -n -q 1 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 -n $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 以查看它。
如果你的 ISP 的地址永远不会改变(老实说我不确定它是否会改变),那么你可以获取它一次,然后用它替换第二行的 $ISP
这已经在 Mac 上进行了测试,非常成功。
到目前为止,我在 linux 上发现的唯一调整是 traceroute "-M" 标志可能需要改为 "-f"
它在很大程度上依赖于 ping 的“-R”标志,它告诉它发送回主机并不总是支持的“记录路由”信息。但值得一试!
不依赖任何外部服务器的唯一另一种方法是通过卷曲调制解调器的状态页面来获取它...我已经使用我们的前沿 DSL 调制解调器成功地完成了这项工作,但它很脏、很慢、不可靠,并且需要对调制解调器的密码进行硬编码。
这是“过程”:
curl http://[user]:[password]@[modem's LAN address]/[status.html] | grep 'WanIPAddress =' | grep -m 1 -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
获取原始 html,搜索任何包含“WanIpAddress =”的行(更改它以使其适合您的调制解调器的结果),然后将这些结果缩小到 IPv4 样式地址。
希望有帮助!