我可以使用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/
如果
那么你可以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。
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
我做了很多,并从很多设备,所以我做了我自己的两个服务在服务器上:
在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
使用自定义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投票)。
一个简单的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 }" 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,则使用额外的代码)。
$ 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"
$ 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"