作为安装脚本的一部分,我想对机器的公有 IP地址进行“有根据的猜测”。 它应该尽可能健壮,在各种主机和平台上工作。 这里是一个例子:
https://gist.github.com/4669037
该脚本使用3种方法,然后默认为/etc/hostname
的值。 我只在Ubuntu上testing过。 这可能会在其他发行版上工作吗? 还有其他方法可以添加吗?
curl ipinfo.io/ip
要么
wget -qO- ipinfo.io/ip
要么
lynx -source ipinfo.io/ip
获取公共IP地址
curl ifconfig.me
将是最好的选择,如果你没有卷曲:
wget -qO- ifconfig.me/ip
你要找多少公众的知识产权? 如果机器在NAT后面呢?
curl
/ wget
/ netcat
( nc
) <URL>
其中包含请求者的地址:应该在大多数情况下工作,但是该站点可能无法从本机访问(无论是防火墙还是临时/永久不可用)。 你会得到最公共的IP你可以。
ifconfig
:必须以超级用户身份运行,否则您必须尝试/sbin/ifconfig
或/usr/sbin/ifconfig
。 如果机器有更多的网卡呢? 你怎么知道什么IP是正确的? 如果在机器的局域网上仅使用IPv6,该怎么办? 在任何情况下,您都可以获得最少的公有IP(如果在计算机上配置了更多接口,则可能是错误的 – 现在通常使用网络tap设备和/或无所不在的虚拟化)。
/etc/hostname
:不需要存在,在许多系统上它是/etc/HOSTNAME
,它不包含IP地址,而应该包含主机名(通常是FQDN)。
问题是,它可能会失败的方式很多,您可能应该考虑:a)更具体地指定您所针对的系统; b)您是否真的需要知道IP – 是一种解决方案,似乎是工作在简单的情况下值得使用,当它失败惨痛的稍微更复杂的设置? 如果您认为您需要知识产权,请准备好处理失败的方法,以防万一您根本没有获得知识产权,或者得到错误的知识产权。
如果你在nat后面,这个解决方案不起作用。 它有助于没有第三方服务。 如果机器上有连接,就像服务器或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 rrar;echo $a; } )
试试这个命令:
wget -O - -q icanhazip.com
使用卷曲来打shtuff.it IP服务
curl http://shtuff.it/myip/short
使用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"
只使用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打开一个socket给icanhazip并发送一个http请求,这个IP地址是在返回数据的最后一个非空行上返回的。 (以前的行是http头)
这样就避免了像wget或curl这样的http客户端的需要。
如果在AWS EC2上,您可以使用:
curl checkip.amazonaws.com
注意:此服务可以从任何Web客户端使用。