在Shell脚本中查找公共IP地址


39

我可以使用ifconfig或hostname -i命令找到我的IP地址。

但是如何找到我的公共IP?

(我有一个静态公共IP,但是我想使用unix命令找到它)


您是否正在尝试以编程方式执行此操作?
安德鲁·基思

是的,在shell脚本中
shantanuo

1
您正在使用Linux,MacOSX,FreeBSD等吗?对于这些不同的操作系统,“ ifconfig”的输出是不同的,并且在MacOSX上不存在“ ip”命令。您是在寻找计算机的IP(需要shell脚本来解析ifconfig之类的东西)还是路由器的IP(下面的网站可能工作)?
Stefan Lasiewski 2010年

Answers:


49

curl ifconfig.me

curl ifconfig.me/ip (仅用于ip)

curl ifconfig.me/all (有关更多信息,需要时间)

有关更多命令,请访问:http : //ifconfig.me/#cli_wrap


1
IPv6地址呢?
Matt3o12

该链接已死。您可以改用以下方法:curl http://checkip.amazonaws.com/
Farhan.K

@ Farhan.K请将此作为答案发布,因为这可能是最佳答案。如果您不这样做,我会提起您的名字,以
提醒

@Aliostad,请随意发布:)
Farhan.K

@ Farhan.K argh,受保护:/
Aliostad

26

您可以要求myip.opendns.com。来自OpenDNS。 dig @208.67.222.220 myip.opendns.com


8
太酷了。对于任何更容易记住的版本,您可以输入dig @resolver1.opendns.com myip.opendns.com。或在Windows上:nslookup myip.opendns.com resolver1.opendns.com
Michael Kropat

2
最适合我的是:dig @208.67.222.220 myip.opendns.com +short为了直接获取ip,而不必经历整个答案。
Christopher Chiche 2014年

18

dig @ns1.google.com -t txt o-o.myaddr.l.google.com +short

dig -4 @ns1-1.akamaitech.net -t a whoami.akamai.net +short

dig -4 @resolver1.opendns.com -t a myip.opendns.com +short


请注意,以上内容仅适用于当前的IPv4(这些解析器甚至都没有当前使用的IPv6,但是如果您省略-4和显式-t a,则可能会在将来崩溃(除了Google的txt,实际上可能适用于IPv6)。如果Google正确启用,则为一天的IPv6))。

请注意,这myip.opendns.com只能通过解决resolver1.opendns.com,而不能通过解决,auth1.opendns.com因此,他们似乎在进行DNS劫持和自己域名的中间人!因此,您不能使用它来查找随机解析器的IP,因为它对而言resolver1.opendns.com不是权威myip.opendns.com

请注意,这o-o.myaddr.l.google.com看起来是最灵活且永不过时的方法;甚至可以测试您的DNS解析器是否支持客户端子网的实验性EDNS0扩展(很少有解析器支持):

% dig @8.8.8.8 -t txt o-o.myaddr.l.google.com +noall +answer +stats | tail -8
;; global options:  printcmd
o-o.myaddr.l.google.com. 60     IN      TXT     "74.125.189.16"
o-o.myaddr.l.google.com. 60     IN      TXT     "edns0-client-subnet 88.198.54.0/24"
;; Query time: 13 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Dec  8 20:38:46 2013
;; MSG SIZE  rcvd: 114

2
@ Matt3o12 <我找到了OpenDNS :dig +short AAAA myip.opendns.com @2620:0:ccc::2
bufh 2015年

如今,从Google获取TXT记录的方法同时支持IPv4和IPv6,因此您应该指定-4-6是否需要特定的IP版本。
马丁

12

如果您可以访问互联网,则非常简单的答案是:

curl icanhazip.com

请记住,为您的IP信任第三方资源可能会遇到问题,尤其是如果您对这些数据进行特殊处理的话。

一种更可信赖的方法是选择一个已知的,可信赖的DNS服务器(理想情况下运行DNSSEC),并使用它查询框的主机名,前提是您的DNS服务器包含此类条目。

dig @trustworthysource.com +short `hostname`



5

如果

  1. 您只有一个公共IP地址,
  2. 您直接连接到互联网(没有NAT /代理/ VPN等)

那么您只需解析ifconfig的输出以获取接口的IP地址(“ inet addr:”部分),即可获取所有接口的IP地址列表。不在私有范围内的一个IP地址(请参阅http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses)是您的公共IP地址。

相同的列表也可以通过以下方式获得

ip addr show

这可能更容易解析。

如果您没有直接的Internet连接(NAT等),则没有外部帮助就无法找到您的公共IP地址(因为您的计算机不知道)。然后,您必须像其他答案一样进行操作。


4

通过使用专为NAT穿越设计的STUN协议,我采取了一些不同的方法。如果您使用Ubuntu,则可以通过输入以下命令安装软件包“ stun”:

sudo apt-get install stun

该软件包安装了您可能不需要的STUN服务器,但它也附带了我用来解决此问题的STUN测试客户端。现在,您可以使用一个(不是那么简单)的命令来检索公共IP:

stun -v stunserver.org 2>&1 1>/dev/null | grep MappedAddress | sed -e 's/.*MappedAddress = //' -e 's/:.*//' | uniq

现在,它的作用是:stun与公共STUN服务器“ stunserver.org”联系,并用您的公共IP返回答案,其余命令只是从输出中过滤出IP。


stun.l.google.com更快:D
Zibri

3

一种方法是,您可以在

http://www.biranchi.com/ip.php

它返回系统的IP地址


它提供带有text / html类型的纯文本...
bortzmeyer

它不是在浏览器中显示您的IP吗?

2
但是类型错误。
bortzmeyer

@bortzmeyer嗯,“正确的类型”是什么?text/html伪API返回的结果很好-当然不是XML或JSON。text/plain也许,但它完全可以用作text/html
ceejayoz

3
+1不需要翻页的网页。另外wget -q -O - http://wgetip.com/
xofer 2011年

3

Google现在显示您的公共IP地址:http : //www.google.com/search?q= ip


无论是在浏览器中还是通过curl,这都不适合我。
Ladadadada 2012年

那很奇怪。我的在第一个服务器之前在顶部说“您的公共IP地址是XX.XX.XXX.XX-了解更多”。
杰克·威尔逊

在我的3G连接上工作。 在此处了解更多信息
Ladadadada 2012年

Google出于某种奇怪的原因,只会根据User-Agent提供给页面的字符串显示您的IP地址。使用Firefox,它可以工作;但是SeaMonkey禁用了“ Firefox”字符串(通过将“ general.useragent.compatMode.firefox”设置为false),却突然没有。完全不知道为什么Google明确地仅对Firefox而不是对任何Gecko才启用这样的功能,因为还有许多其他基于Gecko的桌面浏览器同样兼容,包括SeaMonkey。
cnst

curl -qs“ google.com/search?q=blowme "|tr”()“” \ n“ | grep Client | cut -d”:“ -f 2 | tr -d”“
Zibri

3

好的...我知道这是事实,也许甚至不值得发布,但这是我的可行解决方案。

#!/bin/sh

IP="$(ifconfig | egrep 'inet ' | sed -e 's/inet //' -e 's/addr://' -e 's/ Bcast.*//' -e 's/127.*//')"
echo $IP

漂亮又简单。


2
这将返回未询问的内部IP地址。但是,作为参考,您也可以使用命令hostname -I(大写的“ i”)执行此操作。
Redsandro

3

最简单的方法是按照建议使用http://ifconfig.me/

在此页面上,您将知道要用于检索什么信息的命令。

对于IP:

卷曲ifconfig.me
要么
卷曲ifconfig.me/ip

对于公共主机名:

卷曲ifconfig.me /主机

有关XML文件中的所有信息:

卷曲ifconfig.me/all.xml

等等...只需查看http://ifconfig.me


2

我经常在很多设备上进行此操作,因此我在服务器上做了自己的两项服务:

  1. Web服务器根目录下的php文件:

    user@host:~$ cat index.php`
    <?php echo $_SERVER['REMOTE_ADDR']; echo "\n" ?>
    

    在外壳上的用法:

    $ curl -4 mydomain.com
    79.22.192.12
    

    也可以使用ipv6:

    $ curl mydomain.com
    2a01:e34:ee7d:180::3
    

    使用netcat:

    $ echo "GET /" | nc myserver.com 80
    2a01:e34:ee7d:180::3
    

    在思科路由器上:

    router#more http://myserver.com/index.php
    79.22.192.12
    
  2. 使用自定义的telnet服务器进行快速破解:xinetd生成/ usr / bin / env:

    service telnet
    {
       server           = /usr/bin/env
       socket_type      = stream
       protocol         = tcp
       flags            = IPv6
       wait             = no
       port             = 23
       cps              = 3 30
       passenv          = %a
    }
    

    然后远程登录到它:

    $ nc -4 myserver.com 23
    REMOTE_HOST=::ffff:79.22.192.12
    
    $ nc myserver.com 23
    REMOTE_HOST=2a01:e34:ee7d:180::3
    

    与路由器的工作原理相同:

    router#telnet myserver.com
    79.22.192.12
    

这样,如果通信中涉及到一些nat或代理,并且您想从显示的IP中知道,则可以使其在内部网络上工作。

它不需要任何第三方服务。


2

为了避免依赖外部资源,我使用Expect远程登录到路由器并获取其公共接口的IP地址。这是一个期望脚本示例:

#!/usr/bin/expect
if { $argc < 3 } {
puts "usage: ./telnet2router.exp router-ip username password"
return -1
}
set ip [lrange $argv 0 0]
set username [lrange $argv 1 1]
set password [lrange $argv 2 2]

spawn telnet $ip
expect "login:" {
    send "$username\r"
}
expect "Password:" {
    send "$password\r"
}
expect "#" {
    send "ifconfig ppp0 | grep inet\r"
    send "exit\r"
}
expect eof

然后,我像这样执行上面的脚本以获取公共IP:

./telnet2router.exp <router-ip> <username> <password> | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1

当然,这是基于这样的假设:我可以使用ifconfig命令对路由器及其基于Linux的路由器进行管理员访问。




1

如果要在路由器上找到外部IP地址,则可以向路由器本身询问其WAN地址,也可以请外部的人为您获取。

您可以通过手动方式浏览上述任何给定站点,这些站点将返回传入请求的IP。

对于自动方式,您可以尝试:

wget -q -O - http://www.ipaddressworld.com | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}'\. 

这将使您获得包含http响应上的IP地址的行,然后使用sed,awk等将其解析出来


0

您可以只使用外壳程序来检查您的外部IP,也可以使用外部提供程序

#!/bin/bash
TCP_HOST="checkmyip.com"
TCP_PORT=80              
exec 5<>/dev/tcp/"${TCP_HOST}"/"${TCP_PORT}"
echo -e "GET / HTTP/1.0\nHOST:${TCP_HOST}\n" >&5
while read -r line 
do  
    case "$line" in
        *"Your local IP address is"* ) 
            line="${line#*Your local IP address is&nbsp;}"
            line=${line%%</p>*}
            echo "Your ip is: $line"
            exec >&5-
            exit
            ;;            
    esac
done <&5

输出


0
lynx --dump http://www.whatismyip.com/ | grep -o'[0-9]。* \。[0-9]。* \。[0-9]。* \。[0-9]。*'
-m1 

0

我做这个 它只是在没有任何第三方参与的情况下为我提供了IP。

ip地址显示| grep eth0 | grep inet | tr -s“” | 切-f3 -d“” | 切-f1 -d“ /”


3
他想要他的公共IP地址。不是本地的。
杰克·威尔逊

0
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

0

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

1)在许多免费的动态dns服务之一(例如no-ip.com)上注册服务器,这将为您提供一个DNS条目,例如xxx.no-ip.org。

2)安装服务的动态更新工具(将IP更改报告给服务)。

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

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

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


0

在OS X上,这里有两种简单的解决方案,可同时获取私有IP和公共IP(如果使用LaunchBar,则具有奖励代码)。

私人IP

$ ipconfig getifaddr $1
# $1=en0 || en1 || en*

LaunchBar脚本

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(ipconfig getifaddr en1)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"

公共IP

$ dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com
# ||    
$ curl $1
# $1=http://wtfismyip.com/text || http://ip-addr.es || http://icanhazip.com || http://wgetip.com || http://ident.me || http://ifconfig.me || https://shtuff.it/myip/short || http://curlmyip.com

LaunchBar脚本

#!/bin/sh

title="$USER@$(HOSTNAME -s)"
text=$(dig +time=1 +tries=1 +retry=1 +short myip.opendns.com @resolver1.opendns.com)

open "x-launchbar:large-type?font-name=TerminalDosis-Light&string=$text&title=$title"
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.