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

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

但是,如何find我的公有IP?

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

curl ifconfig.me

curl ifconfig.me/ip (只是ip)

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

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

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

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

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

dig -4 @resolver1.opendns.com -ta myip.opendns.com +short


请注意,以上仅适用于IPv4目前(这些parsing器目前甚至似乎没有IPv6,但如果你省略-4和明确的-ta ,那么你冒险将来会崩溃(除了Google的txt ,如果Google有适当的function,那么有一天它可能会适用于IPv6))。

请注意, myip.opendns.com只能通过resolver1.opendns.com ,而不能通过auth1.opendns.com – 所以他们似乎在做一些DNS劫持和中间人自己的域名! 因此,您不能使用它来查找随机parsing器的IP,因为resolver1.opendns.com不是myip.opendns.com权威。

请注意, oo.myaddr.l.google.com看起来是最灵活和面向未来的方法; 它甚至可以testing你的DNSparsing器是否支持客户端子网的实验性EDNS0扩展(很less有parsing器支持):

 % dig @8.8.8.8 -t txt oo.myaddr.l.google.com +noall +answer +stats | tail -8 ;; global options: printcmd oo.myaddr.l.google.com. 60 IN TXT "74.125.189.16" oo.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 

一个非常简单的安纳如果你有互联网接入是:

 curl icanhazip.com 

请记住,相信您的IP的第三方来源可能会有问题,特别是如果您对这些数据做什么有特殊的意义。

更值得信赖的方法是select一个已知,值得信赖的DNS服务器(理想情况下运行DNSSEC),并用它查询该框的主机名,为您的DNS服务器提供这样的条目;

 dig @trustworthysource.com +short `hostname` 

一种方法: http : //www.whatismyip.com/

我为此写了一个简单而快速的web服务。

 curl ident.me 

你可以问你的IPv4:

 curl v4.ident.me 

或IPv6:

 curl v6.ident.me 

该APIlogging在http://api.ident.me/

如果

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

那么你可以parsing从ifconfig输出的接口的IP地址(“inet addr:”部分)的输出来获得所有接口的IP地址列表。 一个不在专用范围内的IP地址(请参阅http://en.wikipedia.org/wiki/IP_address#IPv4_private_addresses )是您的公共IP地址。

同样的列表也可以通过获得

 ip addr show 

这可能更容易parsing。

如果您没有直接的networking连接(NAT等),没有外部帮助(因为您的计算机不知道)无法find您的公共IP地址。 那么你必须像在其他答案一样。

通过使用为NAT Traversaldevise的STUN协议,我采取了一些不同的方法。 如果你使用Ubuntu,你可以通过input以下命令来安装软件包“stun”:

 sudo apt-get install stun 

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

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

现在,它的function是:stun联系公共STUN服务器“stunserver.org”,并用你的公共IP得到一个答案,其余的命令只是从输出中过滤掉IP。

一种方法是,你可以向页面提出请求

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

它会返回您的系统的IP地址

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

好的…我知道这是事后的方式,甚至可能不值得张贴,但这是我的工作解决scheme。

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

好而简单。

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

在此页面上,您将知道要使用哪个命令来获取要检索的信息。

对于IP:

 curlifconfig.me 

要么

 curlifconfig.me/ip 

对于公共主机名:

 curlifconfig.me/host 

对于XML文件中的所有信息:

 curlifconfig.me/all.xml 

等等…只是检查出http://ifconfig.me

我做了很多,并从很多设备,所以我做了我自己的两个服务在服务器上:

  1. 在Web服务器的根的PHP文件:

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

    在shell上的用法:

     $ 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 

    在Cisco路由器上:

     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 } 

    然后telnet到它:

     $ 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 

通过这种方式,您可以使其在您的内部networking上工作,如果通信中涉及到某个nat或代理服务器,并且希望知道您显示的是哪个IP。

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

为了避免依赖外部资源,我使用expect来远程login到我的路由器并获取其公共接口的IP地址。 下面是一个expect脚本示例:

 #!/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 

当然,这是基于假设,我有pipe理员访问路由器,它的基于Linux的路由器,与ifconfig命令可用。

重复许多其他问题(因此我-1投票)。

  • 以编程方式发现公共IP
  • 在POSIX C中获取自己的外部IP地址
  • 尝试使用INATExternalIPAddressCallback在C#中获取NAT的外部IP地址

一个简单的shell脚本解决scheme可以在这里find:

http://bash.cyberciti.biz/misc-shell/read-local-ip-address/

适用于Linux,FreeBSD,SunOS和Apple Darwin(稍作修改)。

如果你想要在你的路由器上find外部IP地址,你可以要求路由器本身的WAN地址,或者要求外面的人为你find它。

对于一个手动的方式,你可以浏览任何上面给出的网站,将返回input的请求的IP。

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

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

这会得到你在http响应中包含ip地址的行,然后用sed,awk等parsing出来

你可以使用shell来检查你的外部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 

产量

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

我这样做 它只是给我没有任何第三方参与的IP。

ip addr show | grep eth0 | grep inet | tr -s“”| 切-f3 -d“”| cut -f1 -d“/”

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

这是另一种替代scheme,取决于业务解决dynamicIP的主机,而不是可能消失或更改格式的“公共服务”站点。

1)在许多免费的dynamicDNS服务之一注册您的服务器(例如no-ip.com)这将给你一个DNS条目,如xxx.no-ip.org。

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

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

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

非常适合在cron作业中使用,以检查dynamicIP是否已更改,并且需要更改某些configuration条目。

在OS X上,这里有两个简单的解决scheme来获得私有和公共IP(如果使用LaunchBar,则使用额外的代码)。

私人IP

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

启动脚本

 #!/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 

启动脚本

 #!/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"