41

作为安装脚本的一部分,我想对机器的公共IP 地址进行“有根据的猜测”。它应该尽可能健壮,可以在各种主机和平台上工作。这是一个例子:

https://gist.github.com/4669037

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

4

12 回答 12

83
curl ipinfo.io/ip

或者

wget -q -O - ipinfo.io/ip

或者

lynx -source ipinfo.io/ip

获取公共 IP 地址

于 2013-01-29T23:54:01.427 回答
12

curl ifconfig.me将是最好的选择,如果你没有卷曲:

wget -qO- ifconfig.me/ip

于 2013-01-30T12:32:10.747 回答
4

您在寻找多少公共公共 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。

于 2013-01-29T23:56:03.887 回答
3

如果在 AWS EC2 上,您可以使用:

curl checkip.amazonaws.com

注意:可以从任何 Web 客户端使用此服务。

于 2017-06-12T06:00:45.420 回答
2

试试这个命令:

wget -O - -q icanhazip.com
于 2014-04-25T20:07:33.130 回答
1

如果您落后于 nat 或其他东西,则此解决方案不起作用。它在没有 3rd 方服务的情况下提供帮助。如果机器上有连接,例如服务器或 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; } )
于 2014-03-05T21:36:47.167 回答
1

仅使用 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 客户端。

于 2017-05-26T00:29:31.237 回答
0

使用 curl 访问 shtuff.it IP 服务

curl http://shtuff.it/myip/short
于 2013-07-02T13:58:04.603 回答
0

我使用 IPGrab 是因为我很容易记住它。

curl http://ipgrab.io
于 2021-01-04T14:57:22.687 回答
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"
于 2016-07-28T07:37:31.843 回答
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玩

于 2021-07-01T20:25:17.623 回答
0

我在这里找到了我个人喜欢的方法:</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}'
于 2022-02-28T01:56:16.587 回答