#1 楼
如果您不在路由器后面,则可以使用ifconfig
找到它。 如果您在路由器后面,则由于路由器进行网络地址转换,因此您的计算机将不知道公用IP地址。您可以询问某个网站使用
curl
或wget
的公共IP地址是什么,然后从中提取所需的信息:curl -s https://checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
或更短的
curl https://ipinfo.io/ip
评论
ty-发布后不久,我意识到我并没有首先在Google上找到答案:看起来这样可以工作curl -s checkip.dyndns.org | sed -e's /.*当前IP地址://'- e's /<.*$//'其他可能性在这里列出:go2linux.org/what-is-my-public-ip-address-with-linux
–kfmfe04
2012年1月16日12:01
确定-您可以将其添加到答案中
–kfmfe04
2012年1月16日13:18
需要说明的是:这是一种hack,而且非常丑陋,所以我进行了编辑以使其更简单,并使人们可以记住。
– jrg
2012年1月16日16:17
就像乔凡尼·P所说的那样。 OP应更改已接受的答案。
–loostro
14年11月11日在21:45
curl -s ipinfo.io/ip
–chao
2015年10月7日在20:38
#2 楼
要查找外部ip,可以使用基于外部Web的服务,也可以使用基于系统的方法。一个简单的方法是使用外部服务,基于ifconfig
的解决方案也仅在不位于NAT
后面的情况下才能在您的系统中工作。下面将详细讨论这两种方法。使用外部服务查找外部IP
最简单的方法是通过命令行浏览器或下载工具使用外部服务。由于在Ubuntu中默认可用
wget
,因此我们可以使用它。要找到您的IP,请使用-
$ wget -qO- https://ipecho.net/plain ; echo
礼貌: />
https://hawknotes.blogspot.in/2010/06/finding-your-external-ip-address.html
https://ipecho.net/plain
您也可以使用
lynx
(浏览器)或curl
代替wget
(对上述命令进行细微改动)来查找外部ip。使用
curl
查找ip:$ curl https://ipecho.net/plain
为获得更好的格式输出,请使用:
$ curl https://ipecho.net/plain ; echo
使用
dig
和OpenDNS
作为解析器的更快(可以说是最快)的方法:这里的其他答案都通过HTTP传递到远程服务器。其中的某些
需要解析输出,或依靠User-Agent标头
使服务器以纯文本格式响应。它们还经常更改
(关闭,更改名称,放置广告,可能更改
输出格式等)。
DNS响应协议是标准化(格式将保持兼容)。
从历史上看,DNS服务(OpenDNS,Google Public DNS等)比任何新潮的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 <interface_name> | grep "inet addr" | awk -F: '{print }' | awk '{print }'
在上面,替换
<interface_name>
带有您实际接口的名称,例如:eth0
,eth1
,pp0
等... 示例用法:
$ LANG=c ifconfig ppp0 | grep "inet addr" | awk -F: '{print }' | awk '{print }'
111.222.333.444
如果您不知道网络接口名称
在终端中键入以下内容(这将获取系统中每个网络接口的名称和IP地址):
$ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( == "inet" ) { print } else if ( == "Link" ) { printf "%s:" , } }' |awk -F: '{ print ": " }'
示例用法:
$ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( == "inet" ) { print } else if ( == "Link" ) { printf "%s:" , } }' |awk -F: '{ print ": " }'
lo: 127.0.0.1
ppp0: 111.222.333.444
礼貌:https ://www.if-not-true-then-false.com/2010/linux-get-ip-address/
UPDATE
LANG=c
已被添加到基于ifconfig
的用法中,因此它始终能显示英语放置,而不考虑区域设置。评论
@ Z9iT,当然。只要安装了wget,它就可以在任何Linux发行版中工作。如前所述,如果您已经有了curl或lynx,请改用它。您需要root权限才能安装,因此请使用sudo apt-get install wget
–saji89
2012年6月1日12:19
如果您不在NAT后面,则使用ifconfig的命令只能工作。
–lukassteiner
2013年1月23日15:52
只需使用-w curl选项而不是echo :) curl -w'\ n'ident.me
–drAlberT
2014年6月11日在8:17
这个使用dig的提议非常不错unix.stackexchange.com/questions/22615/…
–二元异常
15年3月14日在15:31
如果您的计算机直接连接到Internet(很少有这种情况),则没有外部服务的最新版本只能工作,否则,您只会获得本地IP地址。
–rubo77
2015年10月5日,下午2:42
#3 楼
我最喜欢的一直是:curl ifconfig.me
简单,易于键入。
您将必须先安装curl;)
如果ifconfig.me出现故障,请尝试icanhazip.com和或ipecho.net
curl icanhazip.com
或
curl ipecho.net
评论
@ Z9iT,我现在检查一下。是的,它将在您的终端中输出外部IP。
–saji89
2012年6月1日13:13
来自ifconfig.me的响应时间似乎比ipecho.net慢很多。
–德鲁·诺克斯(Drew Noakes)
13-10-25在14:57
如果您没有curl但有wget:wget -U curl -qO- ifconfig.me
–StéphaneChazelas
14年8月14日在20:16
ifconfig.me似乎没有响应:(
–阿斯范·卡兹
16年1月20日在11:51
@AsfandYarQazi-在这里工作。您可以尝试替代者之一,icanhazip.com
–豹
16年1月20日在12:48
#4 楼
icanhazip.com是我的最爱。curl icanhazip.com
您可以显式请求IPv4:
curl ipv4.icanhazip.com
如果不这样做没有
curl
,您可以改用wget
:wget -qO- icanhazip.com
评论
谢谢!我不得不尝试上面建议的许多方法,直到找到一些支持IPv6的方法。遗憾的是,此类服务通常仍仅支持IPv4。
–VladimírČunát
19年2月24日在17:20
#5 楼
我发现所有内容都很烦人且缓慢,所以我写了自己的。它简单快捷。其API位于http://api.ident.me/
示例:
curl ident.me
curl v4.ident.me
curl v6.ident.me
评论
哇,那真是太快了!
–waldyrious
2013年12月7日下午4:19
我发现icanhazip.com解决方案速度更快,并且在输出中包含换行符。
–泰勒·科利尔(Tyler Collier)
2014年8月19日0:00,
是的,最近确实确实更快。只是调整了我的解决方案。
– Pierre Carrier
2014年9月9日下午13:53
荣誉! 2年,您仍然在维护它。做得好。当我需要ip检查时,我想到的是“识别我” :)
– Mohnish
2015年9月28日在1:37
aws的卷曲时间更快http://checkip.amazonaws.com-> ident.me为0.91s vs .241s让我们祈祷aws不会掉下来;)
– Avindra Goolcharan
18年4月12日在1:41
#6 楼
您可以使用DNS请求而不是HTTP请求来查找您的公共IP:$ dig +short myip.opendns.com @resolver1.opendns.com
它使用
resolver1.opendns.com
dns服务器将神奇的myip.opendns.com
主机名解析为您的IP地址。 评论
这真的很快。我执行了一个热身执行,然后每次执行10个执行,并卷曲icanhazip.com。卷曲版本的平均值:174ms。仅DNS版本的平均值:9毫秒。快19倍。另请参阅:unix.stackexchange.com/a/81699/8383
–亚当·蒙森(Adam Monsen)
2015年3月10日在21:06
@AdamMonsen谢谢您的链接。使用DNS(如您所链接的答案所述)的重点是响应是标准的(并且不太可能更改),并且服务(OpenDNS)的保存时间可能比大多数HTTP替代方法更长。发出请求所花费的时间可能会被命令启动时间所掩盖。
– jfs
2015年3月11日,0:40
是的如果卷曲本身比挖掘慢,我不会感到惊讶。即使将它们改写得尽可能相似,卷曲仍然会变慢;它使用HTTP(包括DNS),而dig仅使用DNS。
–亚当·蒙森(Adam Monsen)
2015年3月11日4:16在
#7 楼
Amazon AWScurl https://checkip.amazonaws.com
样本输出:
123.123.123.123
也可以在浏览器上使用:http://checkip.amazonaws.com
我喜欢它,因为:
它只返回回复正文中的纯文本IP,没有别的
它来自知名提供商,不太可能很快下线
评论
正在寻找名称已知的解决方案,谢谢
–Manohar Reddy Poreddy
19年11月10日在2:41
#8 楼
我正在使用的是:wget -O - -q icanhazip.com
是的,您可以使用ip :-)
评论
我更喜欢curl icanhazip.com,有时wget是唯一可用的,但是有时没有wget也可用,而curl是您唯一的选择(例如OS / X)。无论哪种方式,curl icanhazip.com几乎都可以像curl ifconfig.me一样简单,但是更有趣;-)
– TryTryAgain
2012年8月25日在20:38
#9 楼
确切地键入此内容,然后在指示的位置按Enter键:a
telnet ipecho.net 80
示例输出:
$ 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对我来说是一个优势:一个衬板:printf“获取/ plain HTTP / 1.1 \ nHOST:ipecho.net \ nBROWSER:web-kit \ n \ n” | nc ipecho.net 80
–臭氧
2014年3月19日5:32
#10 楼
为此,发明了STUN。作为客户端,您可以将请求发送到公开可用的STUN服务器,并使其返回自己看到的IP地址。有点低级的whatismyip.com,因为它不使用HTTP,也不使用精巧的DNS服务器,但是使用了快速的STUN协议。使用
stunclient
如果安装了
stunclient
(在debian / ubuntu上为apt-get install stuntman-client
),您可以轻松执行以下操作:$stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541
其中
A.B.C.D
是本地网络上计算机的IP地址,而W.X.Y.Z
是IP地址服务器(例如网站)从外部(以及您正在寻找的地址)进行查看。使用sed
可以将上面的输出减少到一个IP地址:stunclient stun.services.mozilla.com |
sed -n -e "s/^Mapped address: \(.*\):.*$//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/'
回声定义了一个二进制STUN请求(0x0001表示绑定请求),其长度为8(0x0008),其中包含cookie 0xc00cee和一些粘贴的东西从wireshark。
可以工作,但不建议用于生产环境:-)
PS。许多STUN服务器都是可用的,因为它是SIP和WebRTC的核心技术。从Mozilla使用一个应该是安全的隐私保护措施,但是您也可以使用另一个:STUN服务器列表
评论
+1是最怪异且实际上是最合适的技术。 http查询有效,这是我一生以来一直在使用的功能,但是我喜欢这个问题实际上已经有人提出来了。我不知道谢谢!
– Mike S
16-10-18在17:47
#11 楼
另一个快速的(相对而言可能是最快的)curl ipecho.net/plain
#12 楼
我通过telnet为此提供了一项愚蠢的服务。像这样的东西:telnet myip.gelma.net
Your IPv4: xxx.xxx.xxx.xxx
Your IPv6: ::ffff:xxxx:xxxx
随意使用它。
#13 楼
您可以仅使用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
评论
这与checkip.amazonaws.com结合起来对我来说是最快的
– Avindra Goolcharan
18年4月12日在1:44
@AvindraGoolcharan尝试DNS请求
– jfs
18年4月12日在6:56
#14 楼
这些将获取本地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
评论
ifconfig | sed -nre'/ ^ [^] + / {N; s / ^([^] +)。* addr:*([^] +)。* / \ 1,\ 2 / p}'将打印本地接口和相应的V4 IP
– Hannu
14-6-27在18:09
ifconfig | sed -nre'/ ^ [^] + / {N; N; s / ^([^] +)。* addr:*([^] +)。* addr:*([^] +)。* / \ 1,\ 2,\ 3 / p}'-v4和v6 IP。
– Hannu
14年6月27日在18:15
#15 楼
对于拥有路由器登录访问权限的我们来说,使用脚本询问路由器的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)
请注意,这不是很安全(纯文本就是这种情况)凭据和登录大多数路由器),并且肯定是不可移植的(每个路由器都需要更改)。但是,它是在物理上安全的家庭网络上非常快速且绝对合理的解决方案。 br />
评论
您应该尝试以语法方式获取路由器的IP地址。例如,router = subprocess.check_output(['ip','-o','ro','list','0.0.0.0/0']).split()[2]。
–克里斯蒂安·丘皮图
2014年6月2日,下午2:26
#16 楼
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 "<?xml version='1.0' encoding='utf-8'?> <s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'> <s:Body> <u:GetExternalIPAddress xmlns:u='urn:schemas-upnp-org:service:WANIPConnection:1' /> </s:Body> </s:Envelope>" -s
,然后,从答案中提取IP地址。
grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'
#17 楼
如果您使用的是DD-WRT,那么这对我有用:/>其中192.168.1.1是DD-WRT路由器的网关/路由器LAN IP地址。
-s组件表示无声(即不显示卷曲进度信息)。
我应该提到我将上述内容与“ DD-WRT v24-sp2(01/04/15)std”一起使用。
#18 楼
如果您已在Ubuntu中安装lynx,请输入lynx bot.whatismyipaddress.com
评论
curl bot.whatismyipaddress.com也可以工作。
–桃文
15年1月30日在8:26
#19 楼
请使用ip
!评论
问题是关于公共而非内部IP地址
–狼
16-10-22在20:24
#20 楼
也许我来晚了,但是inxi可以做到。安装
inxi
sudo apt install inxi
,然后运行以下命令
inxi -i
使用
z
选项将我的信息屏蔽掉的示例,以便复制并粘贴到以下站点:<filter>
表示您的WAN IP,IPv4,MAC地址等的显示位置#21 楼
只需为任何网站或服务发出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" ) { print } }'
输出是...
(199.21.149.1)
我不认为依赖PHP脚本,并且排序是一种好习惯。
评论
这很有趣,尽管确实很慢,并且不会像这样获取我的外部IP
–rubo77
2015年10月5日,下午2:46
这个答案太不准确了而无用。在公司环境中,我根本没有IP地址。唯一可行的方法是,如果您了解本地路由器和交换机的制作方式,那么即使您跳过本地跳数,它也可能不在第2行上。没有办法用这种技术制作出连贯的算法,这里还有许多其他的解决方案,它们更简单,每次都能为您提供正确的答案。
– Mike S
16-10-18在17:52
尽管它可以在某些特殊配置中工作,但实际上我从未在跟踪路由中看到过我的外部IP。它通常是我的网关(如果我不在NAT之后),或者是我的路由器的网关,但通常是更远的其他路由器。
– mivk
17年2月14日在11:52
别名ip ='lynx --dump ipecho.net/plain'
– phildobbin
17 Sep 14 '17:26
#22 楼
除了8.8.8.8是GOogle DNS之外没有任何依赖性的命令:echo $(ip route get 8.8.8.8 | awk '{print $NF; exit}')
评论
这仅告诉您本地传出接口的IP地址。
–冈伯特
2015年9月17日下午16:15
如果我在云服务器上运行,该命令会显示公共IP地址。是不是这个问题?
–罗夫
2015年9月17日20:48在
不,您在哪里看到“云服务器”?
–冈伯特
15年9月17日在20:52
评论
“具有动态IP”,“通过Internet使用其他系统的SSH”,“将显示当前PUBLIC IP的命令”。您在这里看到鸡肉/鸡蛋问题吗?如何在不知道其地址的情况下在远程服务器上运行命令?您可能对no-ip.com / DynDNS.org等服务更感兴趣。在不知道公用IP我的朋友的情况下就无法进行SSH ... dynDNS花费很多,并且没有IP艰苦的工作,但是这种情况不允许...无论如何该问题已经得到回答..谢谢您的建议
PS duckduckgo.com/?q=ip(没有命令行,也没有大哥G)
也许这应该是一个单独的问题,但是当我的公共IP地址更改时,我希望看到一条警报。现在,我仅在带有notify-send的crontab中使用以下答案。
以下很棒的解决方案。对于Centos,请使用:ifconfig eth1 | sed -nre'/ ^ [^] + / {N; s / ^([^] +)。* inet *([^] +)。* / \ 2 / p}',其中eth1是感兴趣的网络设备,您可以省略'et1'字符串以显示所有适配器的所有ip。代替\ 2,您也可以写\ 1 \ 2来显示每个适配器的名称。