作为安装脚本的一部分,我想对机器的公共IP 地址进行“有根据的猜测”。它应该尽可能健壮,可以在各种主机和平台上工作。这是一个例子:
https://gist.github.com/4669037
此脚本使用 3 种方法,然后默认为/etc/hostname
. 到目前为止,我只在 Ubuntu 上对此进行了测试。这可能适用于其他发行版吗?还有我可以添加的其他方法吗?
curl ifconfig.me
将是最好的选择,如果你没有卷曲:
wget -qO- ifconfig.me/ip
您在寻找多少公共公共 IP?如果机器在 NAT 后面怎么办?
curl
// wget
( netcat
)nc
其中<URL>
包含请求者的地址:大部分时间应该可以工作,但可能该站点可能无法从机器访问(无论是防火墙还是临时/永久不可用)。您将获得尽可能多的公共 IP。
ifconfig
: 必须以root身份运行,否则您必须尝试/sbin/ifconfig
或/usr/sbin/ifconfig
也一样。如果机器有更多的网卡怎么办?您如何判断哪个 IP 是正确的?如果机器的 LAN 上只使用 IPv6 会怎样?在任何情况下,您都将获得尽可能少的公共 IP(如果在机器上配置了更多接口,则可能是错误的 IP - 如今使用网络分流设备和/或无处不在的虚拟化通常就是这种情况)。
/etc/hostname
: 不需要存在,在许多系统上它是/etc/HOSTNAME
,并且它不包含 IP 地址,而应该包含主机名(通常是 FQDN)。
关键是,它可能失败的方式很多,您可能应该考虑a)更准确地指定您的目标系统或b)您是否真的需要知道IP - 这是一个似乎当它在稍微复杂的设置中惨遭失败时,在值得使用的简单情况下工作?如果您认为自己需要 IP,请准备一种方法来优雅地处理故障,以防您根本没有获得 IP 或获得错误的 IP。
如果在 AWS EC2 上,您可以使用:
curl checkip.amazonaws.com
注意:可以从任何 Web 客户端使用此服务。
试试这个命令:
wget -O - -q icanhazip.com
如果您落后于 nat 或其他东西,则此解决方案不起作用。它在没有 3rd 方服务的情况下提供帮助。如果机器上有连接,例如服务器或 ppp 连接,它就可以工作。
您可以从中获取(第一个)默认路由route -n
,找到它使用的接口,并找到它拥有的 ip。
MAINIF=$( route -n | grep '^0\.0\.0\.0' | head -n 1 | awk '{print $NF}' )
IP=$( ifconfig $MAINIF | { IFS=' :';read r;read r r a r;echo $a; } )
仅使用 bash(在icanhazip.com的帮助下):
exec 3<>/dev/tcp/icanhazip.com/80
echo -e 'GET / HTTP/1.0\r\nhost: icanhazip.com\r\n\r' >&3
while read i
do
[ "$i" ] && myip="$i"
done <&3
echo "$myip"
bash 打开一个到 icanhazip 的套接字并发送一个 http 请求,在返回的数据的最后一个非空行上返回 IP 地址。(前几行是 http 标头)
这避免了需要像 wget 或 curl 这样的 http 客户端。
使用 curl 访问 shtuff.it IP 服务
curl http://shtuff.it/myip/short
我使用 IPGrab 是因为我很容易记住它。
curl http://ipgrab.io
使用ipify API:
curl 'https://api.ipify.org?format=json'
bash 脚本:
#!/bin/bash
ip=$(curl -s https://api.ipify.org)
echo "My public IP address is: $ip"
我在这里找到了我个人喜欢的方法:</p>
dig +short myip.opendns.com @resolver1.opendns.com
dig +short txt ch whoami.cloudflare @1.0.0.1
dig +short txt o-o.myaddr.l.google.com @ns1.google.com
dig +short txt o-o.myaddr.l.google.com @ns1.google.com | awk -F'"' '{print $2}'