在bash中检测公共IP地址的方法

作为安装脚本的一部分,我想对机器的公有 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 / netcatnc<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客户端使用。