确定我的公共IP的命令?

如果我查看谷歌 ,我可以看到我的公共IP。 在Ubuntu命令行上有什么东西能给我同样的答案吗?

如果您不在路由器后面,可以使用ifconfig找到它。

如果您在路由器后面,那么您的计算机将不知道公共IP地址,因为路由器进行网络地址转换。 你可以问一些网站你的公共IP地址使用curlwget并从中提取你需要的信息:

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

或更短

 curl ipinfo.io/ip 

要查找外部IP,您可以使用外部基于Web的服务,也可以使用基于系统的方法。 更容易使用外部服务,只有当您不在NAT后面时,基于ifconfig的解决方案才能在您的系统中运行。 下面详细讨论了这两种方法。

使用外部服务查找外部IP

最简单的方法是通过命令行浏览器或下载工具使用外部服务。 由于wget默认在Ubuntu中可用,我们可以使用它。
要找到你的IP,请使用 –

 $ wget -qO- http://ipecho.net/plain ; echo 

礼貌

您还可以使用lynx (浏览器)或curl代替wget ,并对上述命令进行微小修改,以找到您的外部IP。

使用curl查找ip:

 $ curl ipecho.net/plain 

为了更好的格式化输出使用:

 $ curl ipecho.net/plain ; echo 

使用dig OpenDNS作为解析器的更快(可以说是最快)的方法:

这里的其他答案都通过HTTP转发到远程服务器。 其中一些需要解析输出,或者依赖User-Agent标头使服务器以纯文本forms进行响应。 它们也经常变化(下载,更改名称,放置广告,可能会更改输出格式等)。

  1. DNS响应协议是标准化的(格式将保持兼容)。
  2. 从历史上看,DNS服务(OpenDNS,谷歌公共DNS,…)往往存活时间更长,更稳定,可扩展,并且通常比任何新的hip whatismyip.com HTTP服务今天都很热门。
  3. (对于那些关心微优化的极客),这种方法本质上应该更快(只需几微秒)。

使用挖掘OpenDNS作为解析器:

 $ dig +short myip.opendns.com @resolver1.opendns.com 111.222.333.444 

复制自: https //unix.stackexchange.com/a/81699/14497

在不依赖外部服务的情况下查找外部IP

  • 如果您知道您的网络接口名称

在终端中键入以下内容:

 $ LANG=c ifconfig  | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}' 

在上面,将替换为您的实际接口的名称,例如: eth0eth1pp0等…

用法示例:

 $ LANG=c ifconfig ppp0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}' 111.222.333.444 
  • 如果您不知道您的网络接口名称

在终端中键入以下内容(这将获取系统中每个网络接口的名称和IP地址):

 $ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }' 

用法示例:

 $ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }' lo: 127.0.0.1 ppp0: 111.222.333.444 

注意:产出是指示性的,而不是真实的。

礼貌: http //www.if-not-true-then-false.com/2010/linux-get-ip-address/

UPDATE

  1. LANG=c已添加到基于ifconfig的用法中,因此它始终提供英语输出,而不管语言环境设置如何。

我最喜欢的一直是:

 curl ifconfig.me 

简单,易于打字。

你必须先安装curl;)

如果ifconfig.me关闭,请尝试icanhazip.com和/或ipecho.net

 curl icanhazip.com 

要么

 curl ipecho.net 

icanhazip.com是我的最爱。

 curl icanhazip.com 

您可以明确请求IPv4:

 curl ipv4.icanhazip.com 

如果你没有curl你可以使用wget代替:

 wget -qO- icanhazip.com 

我发现一切都令人烦恼和缓慢,所以我写了自己的。 它简单而快速。

其API位于http://api.ident.me/

例子:

 curl ident.me curl v4.ident.me curl v6.ident.me 

您可以使用DNS请求而不是HTTP请求来查找您的公共IP:

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

它使用resolver1.opendns.com dns服务器将神奇的myip.opendns.com主机名解析为您的 IP地址。

我正在使用的是:

 wget -O - -q icanhazip.com 

是的,你可以有ip 🙂

亚马逊AWS

 curl http://checkip.amazonaws.com 

样本输出:

 123.123.123.123 

我喜欢它因为:

  • 它只返回明文IP,没有别的
  • 它来自一个知名的提供商,不太可能很快脱机

准确输入 ,按Enter键指示:

telnet ipecho.net 80 输入
GET /plain HTTP/1.1 输入
HOST: ipecho.net 进入
BROWSER: web-kit Enter
输入

这会手动提交HTTP请求,该请求将在HTTP/1.1 200 OK reply的底部返回您的IP

输出示例:

 $ telnet ipecho.net 80 Trying 146.255.36.1... Connected to ipecho.net. Escape character is '^]'. GET /plain HTTP/1.1 HOST: ipecho.net BROWSER: web-kit HTTP/1.1 200 OK Date: Tue, 02 Jul 2013 07:11:42 GMT Server: Apache Expires: Mon, 26 Jul 1997 05:00:00 GMT Cache-Control: no-cache Pragma: no-cache Vary: Accept-Encoding Transfer-Encoding: chunked Content-Type: text/html f 111.222.333.444 0 

另一个快速(可能是最快的,相对)

 curl ipecho.net/plain 

为此, STUN被发明了。 作为客户端,您可以向公共可用的STUN服务器发送请求,并让它返回它看到的IP地址。 排名低级别的whatismyip.com,因为它不使用HTTP,也没有精心设计的DNS服务器,但速度极快的STUN协议。

使用stunclient

如果您安装了stunclientapt-get install stuntman-client on debian / ubuntu),您只需执行以下操作:

 $stunclient stun.services.mozilla.com Binding test: success Local address: ABCD:42541 Mapped address: WXYZ:42541 

其中ABCD是本地网络上的机器的IP地址,而WXYZ是网站上看到的IP地址服务器(以及您正在寻找的那个)。 使用sed您可以将上面的输出减少到只有IP地址:

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

但是,您的问题是如何使用命令行找到它,这可能会使用STUN客户端排除。 所以我想知道……

使用bash

STUN请求可以手工制作,使用netcat发送到外部STUN服务器,并使用ddhexdumpsed进行后处理,如下所示:

 $echo -en '\x00\x01\x00\x08\xc0\x0c\xee\x42\x7c\x20\x25\xa3\x3f\x0f\xa1\x7f\xfd\x7f\x00\x00\x00\x03\x00\x04\x00\x00\x00\x00' | nc -u -w 2 stun.services.mozilla.com 3478 | dd bs=1 count=4 skip=28 2>/dev/null | hexdump -e '1/1 "%u."' | sed 's/\.$/\n/' 

echo定义了一个二进制STUN请求(0x0001表示绑定请求),其长度为8(0x0008),其中包含cookie 0xc00cee和来自wireshark的一些粘贴内容。 只有代表外部IP的四个字节取自答案,清理和打印。

工作,但不建议用于生产:-)

PS许多STUN服务器都可用,因为它是SIP和WebRTC的核心技术。 使用Mozilla中的一个应该是安全的隐私方式,但您也可以使用另一个: STUN服务器列表

我通过telnet为此提供了一项愚蠢的服务。 像这样的东西:

 telnet myip.gelma.net Your IPv4: xxx.xxx.xxx.xxx Your IPv6: ::ffff:xxxx:xxxx 

随意使用它。

您只能使用bash,而不是curlwget来阅读网页:

 $ exec 3<> /dev/tcp/icanhazip.com/80 && # open connection echo 'GET /' >&3 && # send http 0.9 request read -u 3 && echo $REPLY && # read response exec 3>&- # close fd 

将cURL与ipogre.com一起使用(支持IPv4和IPv6)。

IPv4的

 curl ipv4.ipogre.com 

IPv6的

 curl ipv6.ipogre.com 

http://www.ipogre.com/faqs/linux.php

对于我们这些对我们的路由器具有登录访问权限的人来说,使用脚本向路由器询问其“WAN IP地址”是确定外部IP地址的最有效方法。 例如,以下python脚本打印出Medialink MWN-WAPR300N路由器的外部IP:

 import urllib, urllib2, cookielib import re from subprocess import check_output as co cookie_jar = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar)) urllib2.install_opener(opener) def get(url, values=None): data = None if values: data = urllib.urlencode(values) req = urllib2.Request(url, data) rsp = urllib2.urlopen(req) return rsp.read() router = co(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2] url = "http://" + router get(url+"/index.asp") get(url+"/LoginCheck", dict(checkEn='0', Username='admin', Password='admin')) page = get(url+"/system_status.asp") for line in page.split("\n"): if line.startswith("wanIP = "): print line.split('"')[1] exit(1) 

请注意,这不是非常安全(明文凭证和登录到大多数路由器的情况),并且当然不可移植(需要为每个路由器更改)。 然而,它在物理安全的家庭网络上非常快速且是完全合理的解决方案。

要为另一个路由器自定义脚本,我建议在firefox中使用tamperdata插件来确定要发出的HTTP请求。

这些将获得本地IP:

 ifconfig 

或者缩短产量:

 ifconfig | grep inet 

 ip addr show 

可能:

 hostname -I 

这应该获得外部IP

 wget http://smart-ip.net/myip -O - -q ; echo 

注意如果你不介意安装curl ,这也是:

 curl http://smart-ip.net/myip 

如果您已经在Ubuntu类型中安装了lynx

 lynx bot.whatismyipaddress.com 

UPnP可以查询许多家用路由器:

 curl "http://fritz.box:49000/igdupnp/control/WANIPConn1" -H "Content-Type: text/xml; charset="utf-8"" -H "SoapAction:urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress" -d "     " -s 

然后,从答案中grep ip地址。

 grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>' 

如果您使用的是DD-WRT,那么这对我有用

 curl -s 192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: | 

要么

 curl -s -u your_ddwrt_username:your_ddwrt_password http://192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: | 
  • 其中192.168.1.1是DD-WRT路由器的网关/路由器LAN IP地址。

  • -s组件表示静默(即不显示curl进度信息)。

  • 哦,我应该提一下,我使用上面的“DD-WRT v24-sp2(01/04/15)std”

也许我有点晚了,但是inxi可以相当容易。

安装inxi

 sudo apt install inxi 

然后运行以下命令

 inxi -i 

使用z选项阻止我的信息示例复制并粘贴到这样的网站:

 ~$ inxi -iz Network: Card: NVIDIA MCP77 Ethernet driver: forcedeth IF: eth0 state: up speed: 1000 Mbps duplex: full mac:  WAN IP:  IF: eth0 ip-v4:  ip-v6-link: N/A 

在哪里说是您的WAN IP,IPv4,MAC地址等的出现位置

ip

 ip addr show 

然后寻找相关的适配器(不是lo ,通常是eth0 ),并找到inet附近的ip地址。

只需为任何网站或服务发布traceroute ..

 sudo traceroute -I google.com 

第2行在通过我的路由器网关后似乎总是我的公共IP地址。

 user@user-PC ~ $ sudo traceroute -I google.com traceroute to google.com (173.194.46.104), 30 hops max, 60 byte packets 1 25.0.8.1 (25.0.8.1) 230.739 ms 231.416 ms 237.819 ms 2 199.21.149.1 (199.21.149.1) 249.136 ms 250.754 ms 253.994 ms** 

所以,做一个bash命令。

 sudo traceroute -I google.com | awk -F '[ ]' '{ if ( $2 ="2" ) { print $5 } }' 

而输出……

 (199.21.149.1) 

我不认为依赖PHP脚本,这种排序是很好的做法。

除8.8.8.8为GOogle DNS之外没有依赖关系的命令:

 echo $(ip route get 8.8.8.8 | awk '{print $NF; exit}')