如果我向Google查询,我可以看到我的公共IP。 Ubuntu命令行上有什么可以给我同样的答案吗?

评论

“具有动态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来显示每个适配器的名称。

#1 楼

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

如果您在路由器后面,则由于路由器进行网络地址转换,因此您的计算机将不知道公用IP地址。您可以询问某个网站使用curlwget的公共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


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


这里的其他答案都通过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>带有您实际接口的名称,例如:eth0eth1pp0等...

示例用法:

$ 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 AWS
curl 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进行后处理,hexdumpsed像这样:

$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来阅读网页,而无需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


评论


这与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