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

时间:2013-01-29 23:40:36

标签: linux bash shell ubuntu centos

作为安装脚本的一部分,我想做一个有根据的猜测"关于机器公共 IP地址。它应该尽可能健壮,适用于各种主机和平台。这是一个例子:

https://gist.github.com/4669037

此脚本使用3种方法,然后默认为/etc/hostname的值。到目前为止我只在Ubuntu上测试了这个。这可能适用于其他发行版吗?还有其他方法可以添加吗?

11 个答案:

答案 0 :(得分:47)

curl ipinfo.io/ip

或者

wget -qO- ipinfo.io/ip

或者

lynx -source ipinfo.io/ip

get public ip address

答案 1 :(得分:10)

curl ifconfig.me将是最佳选择,如果您没有卷曲:

wget -qO- ifconfig.me/ip

答案 2 :(得分:3)

您在寻找多少公共IP?如果机器在NAT后面怎么办?

  • curl / wget / netcatnc<URL>包含请求者的地址:应该在大部分时间都有效,但可能是站点可能无法从计算机访问(无论是防火墙还是临时/永久不可用)。您将获得最多的公共IP。

  • ifconfig:必须以root身份运行,否则您还必须尝试/sbin/ifconfig/usr/sbin/ifconfig。如果机器有更多NIC,该怎么办?你怎么知道什么是正确的IP?如果只在机器的LAN上使用IPv6怎么办?在任何情况下,您都可以获得最少的公共IP(如果在计算机上配置了更多接口,则可能是错误的IP) - 现在通常使用网络分接设备和/或无处不在的虚拟化。

  • /etc/hostname:不需要存在,在许多系统上都是/etc/HOSTNAME,并且它不包含IP地址,而应包含主机名(通常是FQDN)。

重点是,它可能失败的方式很多,你可能应该考虑a)更精确地指定你所针对的系统或b)你是否真的需要知道IP - 是一个解决方案这似乎适用于简单的情况,当它在稍微复杂的设置中失败时,值得使用?如果您认为自己需要IP,请准备一种方法,以便在您根本没有获得IP或者出现错误的情况下优雅地处理故障。

答案 3 :(得分:1)

如果你是nat或者其他东西,这个解决方案不起作用。没有第三方服务它会有所帮助。如果机器上有连接,如服务器或ppp连接,它就可以工作。

  • 对问题不是一个完全正确的答案,但可能有助于其他人(像我一样)
  • 需要在大多数(或所有?)案例中成为root用户

您可以从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)

我在其他命令的末尾得到了空白字符:

$ curl -s https://api.ipify.org
255.255.255.255%

我发现将 jsonip.com 与 jq 结合使用可以解决这个问题。这样,解析IP地址就像jq表达式一样简单:

$ curl -s https://jsonip.com | jq -r '.ip'
255.255.255.255

看到这个jq play