如何在Shell脚本中获取我的外部IP地址?


273

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

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

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


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

@billpg:我的意思是NAT路由器的IP
Eugene Yarmash 2011年

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

1
@billpg ipcheckit.com
Gilles

checkip.amazonaws.com使用知名提供商的服务
arulraj.net,2016年

Answers:


441

我建议直接从DNS服务器获取它。

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

  1. DNS响应协议是标准化的(格式将保持兼容)。
  2. 从历史上看,DNS服务(OpenDNSGoogle Public DNS等)往往比今天流行的新型whatismyip.com HTTP服务热度更长,更稳定,更具可扩展性,并且通常受到更多关注。
  3. 这种方法本质上是更快的(可能只有几毫秒!)。

digOpenDNS一起使用作为解析器:

dig @resolver1.opendns.com ANY myip.opendns.com +short

也许为您加上别名,bashrc这样很容易记住

alias wanip='dig @resolver1.opendns.com ANY 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地址。

备用服务器和示例

除了OpenDNS,Akamai和Google还提供类似的DNS服务:

$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168

$ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"

专门要求IPv4地址的示例别名:

alias wanip4='dig @resolver1.opendns.com A myip.opendns.com +short -4'

$ wanip4
80.100.192.168

对于IPv6:

alias wanip6='dig @resolver1.opendns.com AAAA myip.opendns.com +short -6'

$ wanip6
2606:4700:4700::1111

故障排除

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

$ dig @resolver1.opendns.com ANY myip.opendns.com

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

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

;; ANSWER SECTION:
myip.opendns.com.   0   IN  AAAA    2606:4700:4700::1111

;; Query time: 4 msec
;; WHEN: Fri Apr 11 00:00:01 GMT 2011

18
你是正确的它的速度太快..
拉胡尔·帕蒂尔

4
@Krinkle是一个很好的答案。myip.opendns.comGoogle的公共DNS中有与之等效的功能吗?
Kannan Mohan 2014年

12
我发现它的速度比快约19倍curl http://canhazip.com。参见askubuntu.com/a/427092/2273
Adam Monsen

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

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

146

注:这是关于外部 IP地址(一个,当你连接到他们在互联网上的服务器见) -如果你想内部 IP地址(一个你自己的计算机使用的连接,这可能是不同的)看到这回答

TL; DR-2015年最快的方法

使用DNS的最快方法:

dig +short myip.opendns.com @resolver1.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 $4; exit}'

或使用externalip:

externalip ftp

可以使用我的externalip脚本运行以上所有内容:

externalip dns
externalip http
externalip https
externalip telnet
externalip ftp

现在说长话了...

不同的服务器有很多选项可以提供外部IP,尤其是通过此处或其他地方发布的HTTP提供外部IP。

我做了一个基准,看看它们中的任何一个是否比其他的都要好,我对结果感到惊讶。例如,最受推荐的ifconfig.me之一对我而言几乎始终是最慢的,有时需要花费几秒钟来响应。许多服务器不能通过HTTPS进行工作,或者可以通过证书无效而工作。有些响应时间不一致。

基准测试

HTTP和HTTPS

这是我使用的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'

最佳https响应时间:

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%的数据包丢失。)

域名解析

为了进行比较,以下是其他方法所花费的时间-在2015年6月16日由华沙和阿姆斯特丹进行了测试。

使用:

time dig +short myip.opendns.com @resolver1.opendns.com

通常(实际挂钟时间)大约为:

  • 华沙出发0.035秒
  • 距离阿姆斯特丹0.015秒

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

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

在华沙和阿姆斯特丹,它们的响应时间都相同,但在其他地区却并非如此。

使用208.67.222.222-resolver1.opendns.com的IP而不是域名的速度更快:

  • 华沙出发0.023秒
  • 来自阿姆斯特丹的0.009秒

但如果IP更改,将来可能无法使用(尽管对于知名的DNS解析器来说不太可能-也许我应该在我的externalip脚本中使用IP- 请发表评论)。

远程登录

使用nctelnet命令进行Telnet (请参见上文)通常需要:

  • 华沙0.103秒
  • 阿姆斯特丹出发0.035秒

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

的FTP

  • 华沙0.104秒
  • 阿姆斯特丹0.036秒

域名

当使用IP地址代替给定服务的域名时,所有方法都会更快(尤其是首次运行时)(除非HTTP可以使用基于主机的虚拟服务器并且不能与裸IP一起使用-未测试),但是当服务更改IP地址时,它将停止工作,因此速度可能更快,但不能满足未来需求。

评论

如果您从自己的位置看到一些有趣的结果,或者您认为应该推荐其他主机而不是我选择的主机,请发表评论。如果缺少任何重要服务,请在GitHub上发表评论或发布问题。我想通过最新选择的性能最佳的服务来使该帖子保持最新。


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

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

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

您可以将myip.addr.space添加到列表中。我自己创建了这个文件,因为我对当时看到的其他文件并不特别满意。
迈克尔·汉普顿

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

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

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


3
+1我知道whatismyip.com,但不知道whatismyip.org,太棒了。
朱利安

从来不知道那个!很棒的网站!
bbosak 2011年

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

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

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


18

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

curl -s http://ifconfig.me

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


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

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

3
我无法获得这样的IP,只是给它如下:<img src='ipimg.php'/>
Yuugian

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


9

我更喜欢使用curlmyip.com,就像这样简单:

curl curlmyip.com

记住起来很简短。


为了用于bashOP的意图,您不能没有-s其他答案中提到的选项。
Serge Stroobandt,2014年

3
@SergeStroobandt是的,可以。-s交换机所做的所有操作均在无提示模式下运行,即。错误消息将不会显示。因此,这取决于他希望脚本如何处理错误。该命令本身将返回与使用一样可靠的IP地址-s
加勒特·佛格利

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

9
curl ident.me

要么

curl ifconfig.me

要么

curl tnx.nl/ip

要么

curl ipecho.net/plain

要么

curl ip.appspot.com

要么

curl whatismyip.akamai.com

要么

curl icanhazip.com

要么

curl wgetip.com

要么

curl ip.tyk.nu

要么

curl curlmyip.com

要么

curl corz.org/ip

要么

curl bot.whatismyipaddress.com

参考


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

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

@ l0b0尝试忽略该| tail -n1部分,看看您从代理那里得到什么
Eugene Yarmash13年

没什么,只需退出代码1 netcat icanhazip.com 80。看起来它忽略了$http_proxy和朋友,因为仅使用指定代理和端口会-x导致挂起过程。
l0b0 2013年

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

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

4

如果在阅读了所有这些建议之后,您还想阅读更多,这里可能是过度设计的Bash脚本。

它包含一个DNS和HTTP服务器列表,截至2017年2月,它们似乎可以正常运行。

如果您有dig,它将首先尝试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 :
//github.com/mivk/myip


3

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

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

2
也许您可以详细说明您在这里要避免的潜在陷阱?
卡勒布(Caleb)2012年

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

啊,只写脚本:)陷阱
ЯрославРахматуллин

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

3

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

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

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

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

非常适合在cron作业中用于检查动态IP是否已更改,并且某些配置条目需要更改。


3

这总是对我有用,我用它来获取我的IP地址。

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

+1尽管看起来很笨拙,但这种方法对我来说却已经挽救了生命几次。因为互联网不是WWW。你可以上网,但你可能(通常在服务器机房)注定非GUI控制台,在这种情况下是要记住很重要的心脏的checkIP服务网址之一。而且由于这是一种非常普遍的方式,因此它似乎只是经过编译,因为与DynDNS相比,您更容易记住DynDNS之一amazonaws。也就是说,如果您无法通过Google进行搜索。(甚至没有lynx)。
syntaxerror '16

3

由于我不依赖连接或服务,因此我使用以下代码,该代码尝试使用不同的服务来获取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 $1 | grep -o '\.' | wc -l` -ne 3 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 3 dots).";
        exit 1;
elif [ `echo $1 | tr '.' ' ' | wc -w` -ne 4 ]; then
        echo "Parameter '$1' does not look like an IP Address (does not contain 4 octets).";
        exit 1;
else
        for OCTET in `echo $1 | tr '.' ' '`; do
                if ! [[ $OCTET =~ ^[0-9]+$ ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' is not numeric).";
                        exit 1;
                elif [[ $OCTET -lt 0 || $OCTET -gt 255 ]]; then
                        echo "Parameter '$1' does not look like in IP Address (octet '$OCTET' in not in range 0-255).";
                        exit 1;
                fi
        done
fi

return 0;
}

3

ifcfg.me支持:

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

IPv4和IPv6,甚至还有更多东西:ifcfg.me/?


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

是的,dig +short . @ifcfg.me如果您愿意的话可以使用
2015年

2

我为家人提供了云服务,我做了这个快速脚本,cron每天早上5点运行,因为我很便宜,不会购买静态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

1

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

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

1

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

http://ipof.in/txt

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

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

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


1

或者,您可以使用STUN,该发明是自动回答此问题的,并且已广泛用于Internet通信中,例如SIPWebRTC

使用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: \(.*\):.*$/\1/p"

对于仅使用基本命令行工具的替代STUN查找,请参见 我在AskUbuntu上的回答(旨在作为一种有趣的练习,而不用于生产用途)。


0

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

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


0

即使在转换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

1
为什么您会推荐一个?
roaima

@roaima是的,这取决于每个用户。
SebMa '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.