使用脚本来查找我的 IP 地址是否已更改的最简单方法是什么?
背景信息:
我有一个标准的家用电缆调制解调器连接,我的 ISP 为我分配了一个动态 IP。它时不时地会更改,DHCP 租约时间似乎不规律。
基本上,我正在做自己的动态 DNS 事情,只需单击一下即可更新指向我家服务器的 DNS 记录。剩下唯一要做的就是检测 IP 变化,这样我就可以完全自动化这个过程。
现在这里有几个网站可以返回您的 IP 地址,我可以使用 cron 作业来执行wget
其中一个页面并grep
从中获取 IP 地址...但就 CPU / 带宽使用率而言,这似乎有点过度,而且不是很 KISS。
我是否缺少一些简单而优雅的方法来检索我的公共 IP 并检查它是否已更改?
额外信息:我的调制解调器/路由器是一块便宜的砖头,在这方面没有什么特别有趣的功能。我的服务器运行的是 Centos 6。
答案1
假设您位于 NAT 后面,我能想到的最优雅的方式是在路由器本身上运行 cron 作业,定期检查ifconfig
其当前 WAN 地址。如果您能够安装自定义固件,这甚至可以在“廉价砖块”上实现。无论多么优雅,都很难简单。
如上所述这里在 Windows 上,但该论点同样适用于 Centos,在从 NAT 后面轮询 WAN IP 时,您会遇到一个问题,即您从技术上讲没有外部地址。相反,您会根据路由器的判断通过一个地址进行路由。显然,只要路由器在您的控制之下,您仍然可以访问此信息,但没有通用的方法将此 IP 地址传达给本地网络上的主机。因此,您的服务器不能简单地向路由器询问它将使用的外部 IP。
最有效的替代方案是让路由器发挥其魔力,真正连接到外部服务器,然后要求它返回请求来源的地址。许多网络服务器专门为此目的而设置。对于脚本,我可以推荐http://icanhazip.com/,因为它不需要您进行进一步的解析(仅以纯文本形式返回 IP)。
如果有必要,之前链接的问题的答案应该提供大量的实施建议。
答案2
您可以查询任何显示您的 IP 的网站来完成此任务。使用checkip.dyndns.com,因为它是 text.only。
例子:
wget -q -O - checkip.dyndns.com | grep -Po "[\d\.]+"
答案3
前面的答案不包括 PS 实现,实际上并没有告诉您 IP 是否已更改。(我想喜欢 PowerShell。Ryan 很好地指出了我不喜欢的原因:执行安全权限很麻烦)。
只要 IP 没有改变,且其他输出没有改变,就无需解析 IP。例如,checkip.dyndns.com 返回类似“当前 IP 地址:ddd.ddd.ddd.ddd”的内容。因此,只需比较整个输出就足够了。
另外,如果您使用 curl,您可能希望使用 -s 标志隐藏进度。由于它被写入 stderr,因此它不会污染 stdout。
因此,这里有一个简单的 .cmd 脚本,它使用 curl 保存输出。然后它使用 FC 将其与之前的输出(如果有)进行比较。我不需要为 Unicode、区分大小写等设置 FC 选项,因为当 IP 没有改变时,输出应该是二进制匹配。Unix 有 cmp 而不是 FC。
@REM 12/30/2017 The following work:
@REM checkip.dyndns.com
@REM wtfismyip.com/text
@REM icanhazip.com
@REM ifconfig.me/ip -- can be slow
curl icanhazip.com > CurrentIp.txt
fc /B LastIp.txt CurrentIp.txt 1> nul: 2>>&1
if ERRORLEVEL 1 (
ECHO Ip Changed
REM Remember for next time
MOVE /Y CurrentIp.txt LastIp.txt 1>nul:
exit /b 1
) else (
ECHO Ip not Changed
)
显然,CurrentIp.txt LastIp.txt 可以进行更改以适应,例如以“%TMP%\”为前缀。此脚本应该可以从任务计划程序中运行,只需进行微小的更改。
答案4
回应 OP:“我是否缺少一些简单而优雅的方法来检索我的公共 IP 并检查它是否已更改?”
一个非常简单的答案是不要。只需定期更新您的 IP 即可。
这似乎很浪费,但“更智能”的解决方案只是更复杂、更不可靠,而且不节省 CPU、带宽等。每小时发送 1500 字节或更少(一个数据包)非常便宜。一整年将消耗 365 * 24 * 1,500 = 13 兆字节,或约 3 分钟的 Netflix 上的 Rifleman。
获取外部 IP 并偶尔发布新 IP 的 CPU/带宽成本很可能高于定期重复发布 IP。多年来,我每小时都会将我的 IP 发布到 duckdns,没有出现任何问题。显然,如果您开始每秒发布一次,您的域名服务可能会发现这一点并感到恼火。同样,如果您这样做,您用于查找 IP 的任何服务都不会高兴。
最后再说一句,你问的问题是你提到的问题的一部分。当你的域名无法解析到你的服务器时,可能会触发刷新动态 DNS。你可以使用 ping,但如果你的旧 IP 地址被重用,新的 IP 租约持有者可能会对 ping 做出响应。
考虑到这一点,您可以定期尝试从服务器下载一个小签名/魔术文件。实际上,这可以是任何告诉您已找到服务器的静态文件,甚至您的主页也可以,但一个不寻常的名字会比 default.html 好得多。
如果下载失败,请更新您的 IP,清除 DNS 缓存并重试。更新可能需要几分钟才能生效,具体取决于您的 DNS 服务。这种方法消除了对其他外部 IP 站点的依赖,并且实际上测试了您真正想知道的内容:其他人是否可以访问我的站点?