我需要从外壳脚本中找到我的外部IP地址。目前,我使用此功能:

myip () { 
    lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}


但这取决于安装的perl-libwwwperl-html-formatperl-html-tree。我还可以通过哪些其他方式获取我的外部IP?

评论

外部IP是什么意思?到目前为止,这两个答案使用HTTP。响应最终可能是您ISP的代理服务器的IP。 (可能是您想要的。)

@billpg:我的意思是NAT路由器的IP

然后,您将需要一个使用HTTPS的what-is-my-IP Web服务。 las,我什么都不知道。

@billpg ipcheckit.com

checkip.amazonaws.com使用知名提供商的服务

#1 楼

我建议直接从DNS服务器获取它。
下面的大多数其他答案都涉及通过HTTP到远程服务器。其中一些需要解析输出,或者依赖于User-Agent标头使服务器以纯文本格式响应。这些更改非常频繁(更改,更改名称,放置广告,更改输出格式等)。

DNS响应协议已标准化(格式将保持兼容)。
从历史上看,DNS服务(Akamai,Google Public DNS,OpenDNS等)比今天流行的任何新型时髦whatcomyip dot-com HTTP服务都倾向于生存更长的时间,并且更稳定,更具可伸缩性,并且通常受到更多关注。 br />此方法本质上是更快的(仅需几毫秒!)。

dig与OpenDNS解析器配合使用:
dig @resolver4.opendns.com myip.opendns.com +short

也许在您的bashrc中使用它的别名很容易记住
alias wanip='dig @resolver4.opendns.com myip.opendns.com +short'

以简单的IP地址响应:
$ wanip
80.100.192.168 # or, 2606:4700:4700::1111
(缩写自https://ss64.com/bash/dig.html ):
usage:  dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt]

    q-type   one of (A, ANY, AAAA, TXT, MX, ...). Default: A.

    d-opt    ...
             +[no]short          (Display nothing except short form of answer)
             ...

    q-opt    one of:
             -4                  (use IPv4 query transport only)
             -6                  (use IPv6 query transport only)
             ...

ANY查询类型返回AAAA或A记录。要特别喜欢IPv4或IPv6连接,请相应地使用-4-6选项。
要要求响应为IPv4地址,请将ANY替换为A;对于IPv6,请将其替换为AAAA。请注意,它只能返回用于连接的地址。例如,通过IPv6连接时,它无法返回A地址。
替代服务器
各种DNS提供商都提供此服务,包括OpenDNS,Akamai和Google Public DNS:
# OpenDNS (since 2009)
$ dig @resolver3.opendns.com myip.opendns.com +short
$ dig @resolver4.opendns.com myip.opendns.com +short
80.100.192.168

# OpenDNS IPv6 (since 2018)
$ dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short
2606:4700:4700::1111

# Akamai (since 2009)
$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168

# Akamai approximate (since 2018)
# NOTE: This returns only an approximate IP from your block,
# but has the benefit of working with private DNS proxies.
$ dig +short TXT whoami.ds.akahelp.net
"ip" "80.100.192.169"

# Google (since 2010)
$ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"

专门要求IPv4地址的别名示例:
# https://unix.stackexchange.com/a/81699/37512
alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'

$ wanip4
80.100.192.168

并为您的IPv6地址:
# https://unix.stackexchange.com/a/81699/37512
alias wanip6='dig @ns1.google.com TXT o-o.myaddr.l.google.com +short -6'

$ wanip6
"2606:4700:4700::1111"

故障排除
如果命令由于某种原因而无法使用,则上游提供程序,命令行工具或其他可能存在问题。为了帮助理解为什么它不起作用,请运行不带+short选项的命令以显示DNS查询的详细信息。例如:
$ dig @resolver4.opendns.com myip.opendns.com

;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR

;; QUESTION SECTION:
;myip.opendns.com.      IN  A

;; ANSWER SECTION:
myip.opendns.com.   0   IN  A   80.100.192.168

;; Query time: 4 msec


评论


你是对的,那太快了..

–拉胡尔·帕蒂尔(Rahul Patil)
13年7月9日在16:24

@Krinkle是一个很好的答案。 Google的公共DNS中有myip.opendns.com的等效项吗?

–坎南·莫汉(Kannan Mohan)
14-10-26在5:11

我发现它比curl http://canhazip.com快19倍。参见askubuntu.com/a/427092/2273

–亚当·蒙森(Adam Monsen)
15年3月10日在21:09

喜欢这种干净/没有依赖的方法比所有其他建议要好得多,除非您必须绑定端口80

–二元异常
15年3月14日在15:27

请注意,在某些情况下,提供NAT的路由器也会转换DNS响应(您可以查看wiki.nil.com/Network_address_translation_of_DNS_responses);在这种情况下,您应该回退到建议使用其他方法而不是DNS的答案。

–拉兹万·斯特凡内斯库(Razvan Stefanescu)
15-10-30在16:20



#2 楼

注意:这是关于外部IP地址(连接到Internet时服务器在Internet上看到的地址)-如果您想要内部IP地址(您自己的计算机用于连接的地址,可能有所不同),请参见此answer。
; DR-2015年最快的方法
使用DNS最快的方法:
dig +short myip.opendns.com @resolver4.opendns.com

或使用externalip:
externalip dns

使用HTTP最快的方法:
curl -s http://whatismyip.akamai.com/

或使用externalip:
externalip http

使用带有有效证书的HTTPS最快:
curl -s https://4.ifcfg.me/

或使用externalip:
externalip https

使用telnet:
通过nc命令:
nc 4.ifcfg.me 23 | grep IPv4 | cut -d' ' -f4

,或使用externalip:
externalip telnet

通过telnet命令:
telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4

使用FTP:
echo close | ftp 4.ifcfg.me | awk '{print ; exit}'

或使用externalip:
externalip ftp

以上所有内容都可以使用我的externalip脚本运行:
externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

现在很长故事...
提供外部IP规格的不同服务器有很多选择通过HTTP在这里或其他地方发布。
我做了一个基准测试,看它们中的任何一个是否比其他的都要好,我对结果感到惊讶。例如。最受推荐的ifconfig.me之一对我而言几乎总是最慢的,有时需要花费几秒钟来响应。许多服务器无法通过HTTPS进行操作,或者可以通过有效的证书获得证书。有些响应时间不一致。
基准
HTTP和HTTPS
这是我使用的externalip-benchmark脚本的来源:

https:// raw .githubusercontent.com / rsp / scripts / master / externalip-benchmark

您可以自行运行以查看此处提到的哪些服务值得使用:
wget https://raw.githubusercontent.com/rsp/scripts/master/externalip-benchmark
chmod a+x externalip-benchmark
./externalip-benchmark

我的结果从华沙于2015年4月3日上线-地址已更改以保护无辜者:
最佳http响应时间:
0.086s http://ip.tyk.nu/ - answer='172.31.133.7'
0.089s http://whatismyip.akamai.com/ - answer='172.31.133.7'
0.091s http://tnx.nl/ip - answer='172.31.133.7'
0.117s http://ifcfg.me/ - answer='172.31.133.7'
0.156s http://l2.io/ip - answer='172.31.133.7'
0.317s http://ip.appspot.com/ - answer='172.31.133.7'
0.336s http://ident.me/ - answer='172.31.133.7'
0.338s http://ipof.in/txt - answer='172.31.133.7'
0.347s http://icanhazip.com/ - answer='172.31.133.7'
0.496s http://curlmyip.com/ - answer='172.31.133.7'
0.527s http://wgetip.com/ - answer='172.31.133.7'
0.548s http://curlmyip.com/ - answer='172.31.133.7'
0.665s http://bot.whatismyipaddress.com/ - answer='172.31.133.7'
0.665s http://eth0.me/ - answer='172.31.133.7'
1.041s http://ifconfig.me/ - answer='172.31.133.7'
1.049s http://corz.org/ip - answer='172.31.133.7'
1.598s http://ipecho.net/plain - answer='172.31.133.7'

最佳https响应时间:
0.028s https://curlmyip.com/ - answer=''
0.028s https://curlmyip.com/ - answer=''
0.029s https://l2.io/ip - answer=''
0.029s https://tnx.nl/ip - answer=''
0.072s https://whatismyip.akamai.com/ - answer=''
0.113s https://ipecho.net/plain - answer=''
0.117s https://ident.me/ - answer=''
0.207s https://ip.tyk.nu/ - answer='172.31.133.7'
0.214s https://ipof.in/txt - answer='172.31.133.7'
0.259s https://ifcfg.me/ - answer='172.31.133.7'
0.289s https://corz.org/ip - answer=''
0.436s https://ip.appspot.com/ - answer='172.31.133.7'
0.448s https://bot.whatismyipaddress.com/ - answer=''
0.454s https://eth0.me/ - answer=''
0.673s https://icanhazip.com/ - answer='172.31.133.7'
5.255s https://ifconfig.me/ - answer=''
10.000s https://wgetip.com/ - answer=''

(注意:有些内容空白的快速响应-无效。)
最佳平均ping时间:
10.210 //whatismyip.akamai.com/
36.820 //tnx.nl/ip
37.169 //ip.tyk.nu/
39.412 //ipof.in/txt
40.967 //ident.me/
41.257 //ipecho.net/plain
43.918 //ifcfg.me/
45.720 //l2.io/ip
64.749 //ip.appspot.com/
123.412 //corz.org/ip
134.245 //wgetip.com/
157.997 //icanhazip.com/
161.613 //curlmyip.com/
162.100 //curlmyip.com/
268.734 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

这是我于2015年4月3日从阿姆斯特丹获得的结果:
最佳的http响应时间:
0.021s http://ipecho.net/plain - answer='172.31.13.37'
0.027s http://tnx.nl/ip - answer='172.31.13.37'
0.035s http://whatismyip.akamai.com/ - answer='172.31.13.37'
0.039s http://ifcfg.me/ - answer='172.31.13.37'
0.045s http://l2.io/ip - answer='172.31.13.37'
0.142s http://ident.me/ - answer='172.31.13.37'
0.144s http://ipof.in/txt - answer='172.31.13.37'
0.150s http://ip.appspot.com/ - answer='172.31.13.37'
0.150s http://ip.tyk.nu/ - answer='172.31.13.37'
0.170s http://icanhazip.com/ - answer='172.31.13.37'
0.190s http://eth0.me/ - answer='172.31.13.37'
0.191s http://wgetip.com/ - answer='172.31.13.37'
0.301s http://curlmyip.com/ - answer='172.31.13.37'
0.330s http://bot.whatismyipaddress.com/ - answer='172.31.13.37'
0.343s http://curlmyip.com/ - answer='172.31.13.37'
0.485s http://corz.org/ip - answer='172.31.13.37'
3.549s http://ifconfig.me/ - answer='172.31.13.37'
0.004s https://curlmyip.com/ - answer=''
0.012s https://curlmyip.com/ - answer=''
0.012s https://tnx.nl/ip - answer=''
0.016s https://ipecho.net/plain - answer=''
0.071s https://whatismyip.akamai.com/ - answer=''
0.096s https://ifcfg.me/ - answer='172.31.13.37'
0.097s https://ident.me/ - answer=''
0.187s https://corz.org/ip - answer=''
0.187s https://ip.appspot.com/ - answer='172.31.13.37'
0.189s https://ip.tyk.nu/ - answer='172.31.13.37'
0.195s https://eth0.me/ - answer=''
0.253s https://l2.io/ip - answer=''
0.300s https://ipof.in/txt - answer='172.31.13.37'
0.324s https://bot.whatismyipaddress.com/ - answer=''
0.512s https://icanhazip.com/ - answer='172.31.13.37'
1.272s https://ifconfig.me/ - answer=''
10.002s https://wgetip.com/ - answer=''

最佳平均ping时间:
1.020 //ipecho.net/plain
1.087 //whatismyip.akamai.com/
5.011 //ip.appspot.com/
6.942 //ident.me/
7.017 //ipof.in/txt
8.209 //tnx.nl/ip
11.343 //ip.tyk.nu/
12.647 //ifcfg.me/
13.828 //l2.io/ip
81.642 //icanhazip.com/
85.447 //wgetip.com/
91.473 //corz.org/ip
102.569 //curlmyip.com/
102.627 //curlmyip.com/
247.052 //ifconfig.me/
999999 //bot.whatismyipaddress.com/
999999 //eth0.me/

(999999 ping表示100%数据包丢失。)
DNS
此处进行比较是其他方法花费的时间-在2015年6月16日在华沙和阿姆斯特丹进行了测试。
使用:
time dig +short myip.opendns.com @resolver1.opendns.com

通常花费(实际挂钟时间)大约是:

来自华沙的0.035s
来自阿姆斯特丹的0.015s

实际上可以使用这种方式使用四个解析器:

resolver1.opendns.com
resolver2.opendns.com
resolver3.opendns.com
resolver4.opendns.com

它们在华沙和阿姆斯特丹的响应时间都相同,但事实并非如此在其他位置。
使用208.67.222.222-resolver1.opendns.com的IP而不是域名的速度更快:

华沙的0.023s
0.00来自阿姆斯特丹的9s

,但是如果IP更改,将来可能无法使用(尽管对于著名的DNS解析器来说不太可能-也许我应该在我的externalip脚本中使用IP-请发表评论) 。
Telnet
使用nctelnet命令(请参见上文)进行Telnet通常需要:

华沙的0.103s
阿姆斯特丹的0.035s

nctelnet命令之间没有明显区别。)
FTP

华沙的0.104s
阿姆斯特丹的0.036s

域名
使用IP地址代替给定服务的域名时,所有方法都将更快(尤其是首次运行时)(对于可以使用基于主机的虚拟服务器且无法与之配合使用的HTTP除外)裸IP-未测试),但在服务更改IP地址时将停止工作,因此速度可能更快,但不能满足未来需求。
评论
如果您从自己的位置看到一些有趣的结果,或者您认为应该推荐其他主机而不是我选择的主机,请发表评论。如果缺少任何重要服务,请在GitHub上发表评论或发布问题。我想通过最新选择的性能最佳的服务来保持此帖子的更新。

评论


您是否按照Krinkle的回答对myip.opendns.com DNS方法进行了基准测试?当前,由于不知道此方法的其他提供者,因此默认情况下是赢家,但将其与其他方法进行比较仍然很有用。

–詹姆斯·海格(James Haigh)
2015年4月29日在8:16

@JamesHaigh感谢您的建议。我在答案中添加了DNS和其他方法(telnet,f​​tp)。最快的方法似乎是直接使用解析器的IP地址(而不是域名)的DNS。

–rsp
15年6月16日在15:13

您还应该添加/测试canhazip.com / canhazip.com(HTTP和HTTPS)。

–xxdesmus
15年8月22日在16:15



您可以将myip.addr.space添加到列表中。我自己创建了这个文件,因为我对当时看到的其他任何文件都不满意。

–迈克尔·汉普顿
16年5月7日在4:07

有时我使用dig + short myip.opendns.com @ resolver1.opendns.com(36.86.63.180),dig -4 @ ns1-1.akamaitech.net -ta whoami.akamai.net + short(118.98.115.34)会得到不同的结果),然后卷曲http://canhazip.com(36.71.64.71)。如何确定哪一个是正确的?

–Sutandiono
16年9月12日在3:10

#3 楼

 curl -s http://whatismijnip.nl |cut -d " " -f 5


荷兰人替换了一个工作地点。

评论


@MaciekSawicki在这种情况下,真的需要-s选项吗?我在我的fedora 15-bash 4.2.10(1)中尝试使用/不使用它,并且它以两种方式工作。

–ztank1013
2011-10-15 14:05

通过CLI似乎不再起作用,但是可以从Web浏览器转到该网页。我正在使用openSUSE 12.1 x64。

– SaultDon
2012年8月16日16:13

whatismyip.com删除了免费服务来检查外部IP。因此,恐怕这不再正确。 icanhazip.com仍然有效。

– daSong
2013年1月17日10:20



@daSong您不是说whatismyip.org吗?

– Cory Klein
2013年11月25日19:30

一些替代方案:curl ifconfig.me,curl icanhazip.com,curl ipecho.net/plain、curl ifconfig.co,但请记住,使用此方法进行自动化操作是非常不安全的(这些站点的所有者以后随时可以更改输出)而不知道),因此请尽可能使用dig方法。

–马恩
1月8日18:25



#4 楼

由于已经提到whatsmyip.org和ifconfig.me:

curl -s icanhazip.com


评论


另一个:ip.appspot.com或ip.appspot.com

– Lekensteyn
2011年11月9日在8:31

这两个都支持IPv6。

–李Jo
2012年10月8日17:31

@JoshLee,请注意,icanhazip也支持ipv6。另外,请注意OP,所有这些curl解决方案(尽管有效)仍然依赖于外部库(libcurl)。

– HalosGhost
14年7月29日在2:51

另一个:ifcfg.me

–恩
2014年12月17日14:04

#5 楼

您可以使用ifconfig.me替代whatismyip.org。

curl -s http://ifconfig.me


ifconfig.me还有其他一些功能。要了解您还能收到什么其他信息,请访问网站。

评论


它非常慢。我经常获得超过30秒的响应时间,有时甚至超过一分钟!有时是半秒(仍然很多),然后是15秒左右。这是从不同的位置进行测试的。请参阅我的答案以获取更多信息和基准。

–rsp
2015年4月3日4:12



#6 楼

Amazon AWS
curl https://checkip.amazonaws.com

样本输出:
123.123.123.123

也可以在浏览器上使用:http://checkip.amazonaws.com
我喜欢它,因为:

它只返回回复正文中的纯文本IP,没有别的
它来自知名提供商,不太可能很快下线


#7 楼

wget -O - -q http://whatismyip.org/


评论


我无法获得这样的IP,只能将其指定为:

–于ugian
13年4月4日在13:38

可以与大量正则表达式魔术配合使用,但这并不容易。如果您坚持使用此服务,请确保将该行包装到脚本中:$ curl -s http://whatismyip.org | grep -o'\([[[:digit:]] \ {1,3 \} \。\)\ {3 \} [[:digit:]] \ {1,3 \}'

–syntaxerror
16-2-1在2:40



#8 楼

curl ident.me


OR

curl ifconfig.me


OR

curl https://tnx.nl/ip


OR

curl ipecho.net/plain


OR

curl whatismyip.akamai.com


OR

curl icanhazip.com


OR

curl wgetip.com


OR

curl ip.tyk.nu


OR

curl bot.whatismyipaddress.com


参考

#9 楼

netcat icanhazip.com 80 <<< $'GET / HTTP/1.1\nHost: icanhazip.com\n\n' | tail -n1


评论


尽管该站点可以运行,但此处的输出为空。知道为什么吗?如果相关,我将在代理后面,但wget icanhazip.com可以工作。

–l0b0
13年4月4日在11:23



@ l0b0尝试忽略|尾部-n1部分,看看您从代理那里得到什么

– Eugene Yarmash
2013年4月4日13:18



没什么,只是退出代码1。netcat icanhazip.com 80的同上。看起来它忽略了$ http_proxy和朋友,因为用-x指定代理和端口只会导致挂起进程。

–l0b0
2013年4月4日14:05



@ l0b0:netcat代理3128 <<< $'GET http://icanhazip.com/ HTTP / 1.0 \ n \ n'| tail -n 1用于基本的HTTP代理(假设它在端口3128上运行)。不过,您显然会获得代理的IP地址。

–tripleee
13年7月4日在4:07



HTTP 1.0没有主机:请求标头-基于名称的虚拟主机是HTTP 1.1的主要改进之一。更改请求以指定HTTP / 1.1,或删除Host标头(我建议使用前者)。

–用户
13年7月4日在7:39

#10 楼

我更喜欢使用curlmyip.com,它很简单:

curl curlmyip.com

它很短很容易记住。

评论


为了在bash中使用(OP的意图),没有其他答案中提到的-s选项,您将无法做。

– Serge Stroobandt
2014年7月20日在11:53

@SergeStroobandt是的,可以。 -s开关所做的所有操作均以静默方式运行,即。错误消息将不会显示。因此,这取决于他希望脚本如何处理错误。该命令本身将像使用-s一样可靠地返回IP地址。

–加里特·佛格利(Garrett Fogerlie)
14年7月24日在22:48

到目前为止,该站点是多项测试中最可靠的站点。

–阿莫斯·夏皮拉(Amos Shapira)
2014年12月12日上午9:05

#11 楼

如果在阅读完所有这些建议后还想阅读更多内容,可以看这里是过度设计的Bash脚本。

其中包含DNS和HTTP服务器列表,这些列表到2017年2月似乎还可以正常工作。

如果您有dig,它将首先尝试使用DNS,该DNS几乎比各种HTTP服务快一个数量级。

它在收到第一个答复时退出。
/>
如果没有dig或所有DNS服务器都失败,则它会尝试HTTP服务,直到得到答复为止。使用以避免始终使用相同的脚本。

 #!/bin/bash

## Get my external IP

timeout=2   # seconds to wait for a reply before trying next server
verbose=1   # prints which server was used to STDERR

dnslist=(
    "dig +short            myip.opendns.com        @resolver1.opendns.com"
    "dig +short            myip.opendns.com        @resolver2.opendns.com"
    "dig +short            myip.opendns.com        @resolver3.opendns.com"
    "dig +short            myip.opendns.com        @resolver4.opendns.com"
    "dig +short    -t txt  o-o.myaddr.l.google.com @ns1.google.com"
    "dig +short -4 -t a    whoami.akamai.net       @ns1-1.akamaitech.net"
    "dig +short            whoami.akamai.net       @ns1-1.akamaitech.net"
)

httplist=(
    4.ifcfg.me
    alma.ch/myip.cgi
    api.infoip.io/ip
    api.ipify.org
    bot.whatismyipaddress.com
    canhazip.com
    checkip.amazonaws.com
    eth0.me
    icanhazip.com
    ident.me
    ipecho.net/plain
    ipinfo.io/ip
    ipof.in/txt
    ip.tyk.nu
    l2.io/ip
    smart-ip.net/myip
    tnx.nl/ip
    wgetip.com
    whatismyip.akamai.com
)



# function to shuffle the global array "array"
shuffle() {
   local i tmp size max rand
   size=${#array[*]}
   max=$(( 32768 / size * size ))
   for ((i=size-1; i>0; i--)); do
      while (( (rand=$RANDOM) >= max )); do :; done
      rand=$(( rand % (i+1) ))
      tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
   done
}


## if we have dig and a list of dns methods, try that first
if hash dig 2>/dev/null && [ ${#dnslist[*]} -gt 0 ]; then
    eval array=( \"${dnslist[@]}\" )
    shuffle

    for cmd in "${array[@]}"; do
        [ "$verbose" == 1 ] && echo Trying: $cmd 1>&2
        ip=$(timeout $timeout $cmd)
        if [ -n "$ip" ]; then
            echo $ip
            exit
        fi
    done
fi


# if we haven't succeeded with DNS, try HTTP

if [ ${#httplist[*]} == 0 ]; then
    echo "No hosts in httplist array!" >&2
    exit 1
fi

# use curl or wget, depending on which one we find
curl_or_wget=$(if hash curl 2>/dev/null; then echo "curl -s"; elif hash wget 2>/dev/null; then echo "wget -qO-"; fi);

if [ -z "$curl_or_wget" ]; then
    echo "Neither curl nor wget found. Cannot use http method." >&2
    exit 1
fi

eval array=( \"${httplist[@]}\" )
shuffle

for url in "${array[@]}"; do
    [ "$verbose" == 1 ] && echo Trying: $curl_or_wget  "$url" 1>&2
    ip=$(timeout $timeout $curl_or_wget "$url")
    if [ -n "$ip" ]; then
        echo $ip
        exit
    fi
done
 


示例用法(我称为脚本myip):

$ myip
Trying: dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com
"151.101.65.69"

$ ip=$(myip); echo "IP = '$ip'"
Trying: dig +short myip.opendns.com @resolver1.opendns.com
IP = '151.101.65.69'


在脚本顶部注释掉verbose变量,以避免打印使用的服务器。

更新:此脚本现在也在Github上,我可以在需要时更新它:https:// githu b.com/mivk/myip

#12 楼

这始终对我有用,我在conky中使用它来获取我的IP地址。

wget -q -O - checkip.dyndns.org | sed -e 's/[^[:digit:]\|.]//g'


评论


+1尽管看上去很笨拙,但这种方法对我来说却已经挽救了生命几次。因为互联网不是WWW。您可以访问Internet,但是(通常在服务器机房中)注定要使用非GUI控制台,在这种情况下,请务必牢记其中一个checkIP服务URL。而且由于这是一种非常普遍的方式,因此它似乎只是经过编译,因为与亚马逊的一种相比,您将更容易记住DynDNS的一种。也就是说,如果您无法通过Google进行搜索。 (甚至不是山猫)。

–syntaxerror
16-2-1在2:24



#13 楼

如果要使用HTTPS来避免某些潜在的陷阱,请执行以下操作:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"


评论


也许您可以详细说明您在这里要避免的潜在陷阱?

–卡莱布
2012年10月17日下午6:27

域名ipcheckit.com显然是出售的,不再托管IP地址显示服务。

–manatwork
13年1月17日在11:59

啊,只写脚本的陷阱:)

–ЯрославРахматуллин
13年7月4日在14:07

@Chris Down技术仍然有效,您只需要另一个支持SSL的站点即可使用它。

–卡莱布
13年11月25日在21:09

#14 楼

这是另一种选择,它取决于托管业务的主机围绕管理动态IP而不是可能会消失或更改格式的“公共服务”站点来解决。


在众多服务器之一中注册服务器免费的动态dns服务(例如,no-ip.com),这将为您提供一个DNS条目,例如xxx.no-ip.org。
安装服务的动态更新工具(将IP更改报告给服务)。

要获取脚本中的IP地址,只需执行以下操作:

external_ip=`dig +short xxx.no-ip.org`


非常适合用于cron作业,以检查动态IP是否已更改以及一些配置条目需要更改。

#15 楼

由于我不依赖连接或服务,因此使用以下代码,该代码尝试使用不同的服务来获取IP(随意添加更多):

# Get my ip address and put in a file
declare -a arr=("ipecho.net/plain" "ident.me" "tnx.nl/ip" "ip.appspot.com" "https://shtuff.it/myip/short/")
IP=$(curl -s --retry 3 --retry-delay 10 ipecho.net/plain)

while [ -z "$IP" ] # If no IP found yet, keep trying!
do
    sleep 30
    IP=$(curl -s --retry 3 --retry-delay 10 ${arr[$((  RANDOM % ${#arr[@]}  ))]})  
done

echo -n "$IP" >  /root/clientIP.txt #puts ip address in clientIP.txt
echo "Our address is $IP" 


要增强鲁棒性(例如,其中一项服务更改了格式),可以使用以下功能检查$IP是否为有效IP:

# Verify that the parameter passed is an IP Address:
# http://zindilis.com/blog/2013/05/10/bash-check-that-string-is-ip.html
# @Author: Marios Zindilis
# @License: Creative Commons Attribution-ShareAlike 4.0 International License.
# @Date: 2013-05-10
function is_IP() {
if [ `echo  | grep -o '\.' | wc -l` -ne 3 ]; then
        echo "Parameter '' does not look like an IP Address (does not contain 3 dots).";
        exit 1;
elif [ `echo  | tr '.' ' ' | wc -w` -ne 4 ]; then
        echo "Parameter '' does not look like an IP Address (does not contain 4 octets).";
        exit 1;
else
        for OCTET in `echo  | tr '.' ' '`; do
                if ! [[ $OCTET =~ ^[0-9]+$ ]]; then
                        echo "Parameter '' does not look like in IP Address (octet '$OCTET' is not numeric).";
                        exit 1;
                elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then
                        echo "Parameter '' does not look like in IP Address (octet '$OCTET' in not in range 0-255).";
                        exit 1;
                fi
        done
fi

return 0;
}


#16 楼

ifcfg.me支持:

curl ifcfg.me
nslookup . ifcfg.me
telnet ifcfg.me
ftp ifcfg.me
finger @ifcfg.me


IPv4和IPv6,还有更多带有curl的东西:ifcfg.me/?

评论


nslookup方法与Krinkle答案中的dig方法有何关系?他们俩都使用DNS,对吗?因此,我可以通过一些选项进行挖掘以使其检索与nslookup在此处执行的相同DNS记录吗?

–詹姆斯·海格(James Haigh)
2015年4月29日在8:09

是的,您可以使用dig + short。 @ ifcfg.me,如果你愿意

–恩
2015年5月1日18:22

#17 楼

我为家人提供了云服务,我做了这个快速脚本,每天早上5点在cron中运行,因为我很便宜,不会购买静态IP。

它获取公共IP,并将其通过电子邮件发送给我的用户。以超链接格式发送电子邮件,因此我的妈妈不必键入端口或其他任何内容。也许其他人可以使用它。

#!/bin/bash
ipvariable=$(wget http://ipecho.net/plain -O - -q);

echo "Today the location is http://$ipvariable:123456/foldertheyreach" | mail -s   "From your friendly cloud service provider" user1@someemail.com, user2@ect.com


#18 楼

这将在弹出窗口中显示当前ip地址:

zenity --info --text "$(curl -s icanhazip.com)"


#19 楼

我已经设置了将IP地址返回为JSON / XML或纯文本的服务。您可以在这里找到它们

http://ipof.in/txt

与/ json和/ xml相同的URL也会为您提供其他格式

如果需要HTTPS,则可以使用带有https前缀的相同URL。优点是,即使您使用的是Wifi上网,您也将获得公共地址。

因此,简单的别名myip =“ curl https://ipof.in/txt”将获得您的IP

#20 楼

w3m Plaintext-Browser非常适合bash。您可以使用greptail缩短答复,如下所示:

w3m -no-cookie -dump "http://www.whatismyip.com/" | grep -A 1 -m 1 "Your IP:" | tail -n 1


#21 楼

另外,您也可以使用STUN,它被发明为自动回答此问题,并广泛用于互联网通信中,例如通过SIP和WebRTC。

使用stunclient(在debian / ubuntu上执行apt-get install stuntman-client)只需执行以下操作:

$ stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541


其中A.B.C.D是IP地址您的计算机在本地网络上的位置,并且W.X.Y.Z是IP地址服务器,例如从外部(以及您正在寻找的)网站看到的网站。使用sed可以将上面的输出减少到仅一个IP地址:

stunclient stun.services.mozilla.com |
    sed -ne "s/^Mapped address: \(.*\):.*$//p"


对于使用基本命令行工具但不使用其他方法的STUN查找,请参见
我的答案在AskUbuntu上使用(旨在作为一种有趣的练习,不用于生产用途)。

#22 楼

使用curl击打shtuff.it的IP服务

curl -s https://shtuff.it/myip/short


评论


301永久移动

– McPeppr
16年11月8日在9:44

现在链接已死

– Eugene Bujak
17年4月24日在18:50

#23 楼

即使在转换DNS地址的NAT路由器后面也使用DNS请求,这可以起作用:

$ dig +short -t txt o-o.myaddr.l.google.com @ns1.google.com | cut -d'"' -f2
x.y.z.t


,或者,您可以使用HTTP请求方法代替:

$ curl -s ipinfo.io/ip
x.y.z.t


评论


为什么您会推荐一个?

–roaima
18年11月6日在7:10

@roaima是的,这取决于每个用户。

–SebMa
18年11月8日在10:40

#24 楼

如果您中的任何一个托管面向Internet的Web服务器,则只需制作一个简单的页面即可显示请求者的IP地址,例如在PHP中:

<?php

    echo $_SERVER['REMOTE_ADDR'];   

?>


在服务器上部署它。例如在http://mydomain.com/whatismyip.php处,然后使用标准的curl技巧将其检索:

curl -s http://mydomain.com/whatismyip.php


请注意,如果服务器执行任何重定向(例如,从HTTP到HTTPS),您将获得重定向响应而不是您的IP地址。因此,请正确处理curl请求。

这种方法的优点是,该服务不会像您免费服务那样经常从您的身下移动或消失。缺点显然是它的速度可能会变慢,除非您拥有一些高端主机。

#25 楼

只有ip.tyk.nu通过http返回正确的IP,而没有https。这里还有一些返回我们的公共IP并可以执行https的http站点。我在这里了解到,正如一些人所说,在无线链接上使用https而不是http将绕过IP的ISP修改。欧文·霍夫曼(Erwin Hoffman)向dnscache添加了“曲线”加密的dns,我可以尝试使用dig,因为这里有这个。
myip()shell func可以查询http网站列表或使用https:
# ~/bin/.bash/.ifaces https://pastebin.com/DiPUdqPJ
 
myip() {
 [[ "" =~ -s ]] && s='https://' || s=''
 ( for site in ipaddr.pub/cli ipecho.net/plain icanhazip.com ifconfig.me \
     ipconfig.in/ip ident.me bot.whatismyipaddress.com diagnostic.opendns.com/myip \
      checkip.amazonaws.com trackip.net/ip api.ipify.org tnx.nl/ip ip.tyk.nu \
       l2.io/ip wgetip.com
    do echo "$site "
    wget -qO- ${s}$site
    echo
   done
   wget -qO- ${s}checkip.dyndns.org |\
     sed -n -E '/IP Address/s/^.*:[\t ]+([^<]+).*$/checkip.dyndns.org \n/p' ) |\
      sed -n -E '/^$/d;H;${g;s/^[\n]+//;s/( )\n/ /g;p;}'
 wget -qO- ${s}ipinfo.io | sed '1s/.*/ipinfo.io:/;$d;'
}

myip (without https):

ipaddr.pub/cli 166.137.143.2
ipecho.net/plain 166.137.143.2
icanhazip.com 166.137.143.2
ifconfig.me 166.137.143.2
ipconfig.in/ip 166.137.143.2
ident.me 166.137.143.2
bot.whatismyipaddress.com 166.137.143.2
diagnostic.opendns.com/myip 166.137.143.2
checkip.amazonaws.com 166.137.143.2
trackip.net/ip 166.137.143.2
api.ipify.org 166.137.143.2
tnx.nl/ip 166.137.143.2
ip.tyk.nu 107.77.201.2 (without https but this one gets it)
l2.io/ip 166.137.143.2
wgetip.com 166.137.143.2
checkip.dyndns.org 166.137.143.2
ipinfo.io:
  "ip": "166.137.143.2",
  "hostname": "mobile-166-137-143-2.mycingular.net",
  "city": "Dallas",
  "region": "Texas",
  "country": "US",
  "loc": "32.7831,-96.8067",
  "org": "AS20057 AT&T Mobility LLC",
  "postal": "75270",
  "timezone": "America/Chicago",
  "readme": "https://ipinfo.io/missingauth"

myip -s (with https):

ipaddr.pub/cli 107.77.201.2
ipecho.net/plain 107.77.201.2
icanhazip.com 107.77.201.2
ifconfig.me 107.77.201.2
ipconfig.in/ip 107.77.201.2
ident.me 107.77.201.2
bot.whatismyipaddress.com 107.77.201.2
diagnostic.opendns.com/myip 107.77.201.2
checkip.amazonaws.com 107.77.201.2
trackip.net/ip 107.77.201.2
api.ipify.org 107.77.201.2
tnx.nl/ip 107.77.201.2
ip.tyk.nu 107.77.201.2
l2.io/ip 107.77.201.2
wgetip.com 107.77.201.2
ipinfo.io:
  "ip": "107.77.201.2",
  "hostname": "mobile-107-77-201-2.mobile.att.net",
  "city": "Dallas",
  "region": "Texas",
  "country": "US",
  "loc": "32.7831,-96.8067",
  "org": "AS20057 AT&T Mobility LLC",
  "postal": "75270",
  "timezone": "America/Chicago",
  "readme": "https://ipinfo.io/missingauth"