确定我的公共IP的命令?
如果我查看谷歌 ,我可以看到我的公共IP。 在Ubuntu命令行上有什么东西能给我同样的答案吗?
如果您不在路由器后面,可以使用ifconfig
找到它。
如果您在路由器后面,那么您的计算机将不知道公共IP地址,因为路由器进行网络地址转换。 你可以问一些网站你的公共IP地址使用curl
或wget
并从中提取你需要的信息:
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进行响应。 它们也经常变化(下载,更改名称,放置广告,可能会更改输出格式等)。
- DNS响应协议是标准化的(格式将保持兼容)。
- 从历史上看,DNS服务(OpenDNS,谷歌公共DNS,…)往往存活时间更长,更稳定,可扩展,并且通常比任何新的hip whatismyip.com HTTP服务今天都很热门。
- (对于那些关心微优化的极客),这种方法本质上应该更快(只需几微秒)。
使用挖掘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}'
在上面,将
替换为您的实际接口的名称,例如: eth0
, eth1
, pp0
等…
用法示例:
$ 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
-
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
如果您安装了stunclient
( apt-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服务器,并使用dd
, hexdump
和sed
进行后处理,如下所示:
$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,而不是curl
, wget
来阅读网页:
$ 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
对于我们这些对我们的路由器具有登录访问权限的人来说,使用脚本向路由器询问其“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}')