作为安装脚本的一部分,我想做一个有根据的猜测"关于机器公共 IP地址。它应该尽可能健壮,适用于各种主机和平台。这是一个例子:
https://gist.github.com/4669037
此脚本使用3种方法,然后默认为/etc/hostname
的值。到目前为止我只在Ubuntu上测试了这个。这可能适用于其他发行版吗?还有其他方法可以添加吗?
答案 0 :(得分:47)
答案 1 :(得分:10)
curl ifconfig.me
将是最佳选择,如果您没有卷曲:
wget -qO- ifconfig.me/ip
答案 2 :(得分:3)
您在寻找多少公共IP?如果机器在NAT后面怎么办?
curl
/ wget
/ netcat
(nc
)<URL>
包含请求者的地址:应该在大部分时间都有效,但可能是站点可能无法从计算机访问(无论是防火墙还是临时/永久不可用)。您将获得最多的公共IP。
ifconfig
:必须以root身份运行,否则您还必须尝试/sbin/ifconfig
或/usr/sbin/ifconfig
。如果机器有更多NIC,该怎么办?你怎么知道什么是正确的IP?如果只在机器的LAN上使用IPv6怎么办?在任何情况下,您都可以获得最少的公共IP(如果在计算机上配置了更多接口,则可能是错误的IP) - 现在通常使用网络分接设备和/或无处不在的虚拟化。/ p>
/etc/hostname
:不需要存在,在许多系统上都是/etc/HOSTNAME
,并且它不包含IP地址,而应包含主机名(通常是FQDN)。
重点是,它可能失败的方式很多,你可能应该考虑a)更精确地指定你所针对的系统或b)你是否真的需要知道IP - 是一个解决方案这似乎适用于简单的情况,当它在稍微复杂的设置中失败时,值得使用?如果您认为自己需要IP,请准备一种方法,以便在您根本没有获得IP或者出现错误的情况下优雅地处理故障。
答案 3 :(得分:1)
如果你是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 r r a r;echo $a; } )
答案 4 :(得分:1)
尝试此命令:
wget -O - -q icanhazip.com
答案 5 :(得分:1)
如果在AWS EC2上,您可以使用:
curl checkip.amazonaws.com
注意:此服务可以从任何Web客户端使用。
答案 6 :(得分:0)
使用curl来击中 shtuff.it IP service
curl http://shtuff.it/myip/short
答案 7 :(得分:0)
使用 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"
答案 8 :(得分:0)
仅使用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客户端的需要。
答案 9 :(得分:0)
我使用 IPGrab 是因为它很容易让我记住。
curl http://ipgrab.io
答案 10 :(得分:0)