确定我的公共IP的命令?


636

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


2
“具有动态IP”,“通过Internet使用其他系统的SSH”,“将显示当前PUBLIC IP的命令”。您在这里看到鸡肉/鸡蛋问题吗?如何在不知道其地址的情况下在远程服务器上运行命令?您可能对no-ip.com / DynDNS.org等服务更感兴趣。
gertvdijk 2013年

在不知道公用IP我朋友的情况下就无法进行SSH ... dynDNS花费很多,并且没有IP艰苦的工作,但是这种情况不允许...无论如何,这个问题已经回答了..谢谢您的建议
Bhavesh Diwan

1
PS duckduckgo.com/?q=ip(没有命令行,也没有大哥G)
坎帕

1
也许这应该是一个单独的问题,但是当我的公共IP地址更改时,我希望看到一条警报。目前,我仅在带有的crontab中使用以下答案notify-send
PJ Brunet

以下很棒的解决方案。对于Centos使用:ifconfig eth1 | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*inet *([^ ]+).*/\2/p}'eth1是您感兴趣的网络设备,您可以省略'et1'字符串以显示所有适配器的所有ip。取而代之的是\2您也可以写出\1 \2每个适配器的名称。
Hafenkranich

Answers:


916

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

如果您在路由器后面,则由于路由器执行网络地址转换,因此您的计算机将不知道公用IP地址。您可以询问某个网站您的公共IP地址正在使用什么,curl或者wget从中提取所需的信息:

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

或更短

curl https://ipinfo.io/ip

27
ty-发布后不久,我意识到我并没有首先在Google上找到答案:看起来像这样,curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//' 这里列出了其他可能性: go2linux.org/what-is-my-public-ip-address-with-linux
kfmfe04 2012年

1
当然-您可以将其添加到您的答案中
kfmfe04 2012年

1
需要说明的是:这是一种骇客行为,而且非常难看。因此,我进行了修改,使其更简单,并使人们可以记住。
jrg

2
就像乔凡尼·P所说的那样。OP应更改已接受的答案。
loostro 2014年

36
curl -s ipinfo.io/ip
chao

385

要查找外部ip,可以使用基于外部Web的服务,也可以使用基于系统的方法。一种简单的方法是使用外部服务,而且ifconfig只有当您不使用时,基于基础的解决方案才能在您的系统中工作NAT。下面将详细讨论这两种方法。

使用外部服务查找外部IP

最简单的方法是通过命令行浏览器或下载工具使用外部服务。由于wgetUbuntu默认情况下可用,因此我们可以使用它。
要找到您的IP,请使用-

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

礼貌

您也可以使用lynx(浏览器)或curl代替wget上面的命令进行细微改动,以找到您的外部ip。

使用curl要查找IP:

$ curl https://ipecho.net/plain

为了获得更好的格式化输出,请使用:

$ curl https://ipecho.net/plain ; echo

digOpenDNSas一起使用的更快(可以说是最快)的方法:

这里的其他答案都是通过HTTP到达远程服务器的。其中一些需要解析输出,或者依靠User-Agent标头使服务器以纯文本格式响应。它们还经常更改(向下更改名称,放置广告,可能更改输出格式等)。

  1. DNS响应协议是标准化的(格式将保持兼容)。
  2. 从历史上看,DNS服务(OpenDNS,Google Public DNS等)比今天流行的任何新的whatismyip.com HTTP服务都倾向于生存更长的时间,并且更稳定,可扩展且通常得到照顾。
  3. (对于那些关注微优化的极客),这种方法本质上应该更快(因为只有几微秒)。

使用带有OpenDNS的dig作为解析器:

$ 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 $2}' | awk '{print $1}'

在上文中,替换<interface_name>为您的实际接口的名称,如: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

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

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

更新

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

1
@ Z9iT,当然。只要安装了wget,它就可以在任何Linux发行版中工作。如前所述,如果您已经有了curl或lynx,请改用它。您需要具有root用户权限才能安装,请使用sudo apt-get install wget
saji89

13
如果您不在NAT后面,则使用ifconfig的命令只能工作。
lukassteiner 2013年

1
只是使用-wcurl选项而不是echo :)curl -w '\n' ident.me
drAlberT 2014年

3
用挖这个建议是相当不错unix.stackexchange.com/questions/22615/...
binaryanomaly

4
如果您的计算机直接连接到Internet(很少有这种情况),则没有外部服务的最新版本只能工作,否则,您只会获得本地IP地址。
rubo77

117

我最喜欢的一直是:

curl ifconfig.me

简单,易于输入。

您将必须先安装curl;)

如果ifconfig.me出现故障,请尝试icanhazip.com和/或ipecho.net

curl icanhazip.com

要么

curl ipecho.net

3
@ Z9iT,我现在检查一下。是的,它将在您的终端中输出外部IP。
saji89'6

7
的响应时间ifconfig.me似乎比慢ipecho.net
Drew Noakes

3
如果你没有curl,但有wgetwget -U curl -qO- ifconfig.me
斯特凡Chazelas

2
ifconfig.me似乎没有响应:(
Asfand Qazi

1
@AsfandYarQazi-在这里工作。您可以尝试以下一种替代产品,icanhazip.com
Panther

60

icanhazip.com是我的最爱。

curl icanhazip.com

您可以显式请求IPv4:

curl ipv4.icanhazip.com

如果没有,则curl可以使用wget

wget -qO- icanhazip.com

谢谢!我不得不尝试上面建议的许多方法,直到找到一些支持IPv6的方法。遗憾的是,此类服务通常仍仅支持IPv4。
弗拉基米尔·Čunát

48

我发现一切都很烦人且缓慢,所以我写了自己的。简单,快速。

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

例子:

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

1
哇,那是快!
waldyrious

1
我发现icanhazip.com解决方案速度更快,并且在输出中包含换行符。
Tyler Collier 2014年

1
是的,最近确实确实更快。只是调整了我的解决方案。
Pierre Carrier

2
荣誉!2年,您仍然在维护它。做得好。当我需要ip检查时,我想到的是“ IDENTify ME” :)
Mohnish

aws更快time curl http://checkip.amazonaws.com-> 0.91svs .241sfor ident.me让我们祈祷aws不会
掉下

42

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

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

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


3
真的非常快。我执行了一个热身执行,然后每个执行了10个执行curl icanhazip.com。该curl版本的平均值:174毫秒。仅DNS版本的平均值:9毫秒。快19倍。另请参见:unix.stackexchange.com/a/81699/8383
Adam Monsen

1
@AdamMonsen谢谢您的链接。使用DNS(如您所链接的答案所述)的重点是响应是标准的(并且不太可能更改),并且服务(OpenDNS)的保存时间可能比大多数HTTP替代方法更长。发出请求所花费的时间可能会被命令启动时间所掩盖。
jfs 2015年

是的 如果curl它本身比慢,我也不会感到惊讶dig。即使它们被重写为尽可能相似,curl也仍然会变慢。它使用HTTP(包括 DNS),并且dig仅使用DNS。
亚当·蒙森


18

我正在使用的是:

wget -O - -q icanhazip.com

是的,您可以使用ip :-)


3
我更喜欢curl icanhazip.com有时wget是唯一可用的,但有时也没有wget,并且curl是您唯一的选择(例如OS / X)。两种方法curl icanhazip.com几乎都一样容易,curl ifconfig.me但更有趣;-)
TryTryAgain 2012年

11

准确键入此内容,然后Enter在指示的位置按:

telnet ipecho.net 80Enter
GET /plain HTTP/1.1Enter
HOST: ipecho.net Enter
BROWSER: web-kitEnter
Enter

这会手动提交一个HTTP请求,该请求将在 HTTP/1.1 200 OK reply

输出示例:

$ 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

6
很好,这很好用,不需要安装curl对我来说是一个优势:一根衬纸:printf nc ipecho.net 80
臭氧

9

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

curl ipecho.net/plain

9

为此,发明了STUN。作为客户端,您可以将请求发送到公开可用的STUN服务器,并使其返回自己看到的IP地址。有点低级的whatismyip.com,因为它不使用HTTP,也不使用巧妙设计的DNS服务器,但是使用了非常快的STUN协议。

使用 stunclient

如果您已经stunclient安装了(apt-get install stuntman-client在debian / ubuntu上),则只需执行以下操作:

$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: \(.*\):.*$/\1/p"

但是,您的问题是如何使用命令行查找它,这可能不包括使用STUN客户端。所以我想知道...

使用 bash

甲STUN请求可以手工使用发送到外部STUN服务器netcat和进行后处理使用ddhexdump并且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的粘贴内容。从答案中仅取出代表外部IP的四个字节,然后进行清理和打印。

工作正常,但不建议用于生产环境:-)

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


+1是最怪异且实际上是最合适的技术。http查询有效,这是我一生以来一直在使用的内容,但是我喜欢这个问题实际上已经引起了一些思考。我不知道 谢谢!
迈克S

7

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

telnet myip.gelma.net

Your IPv4: xxx.xxx.xxx.xxx
Your IPv6: ::ffff:xxxx:xxxx

随意使用它。


5

你可以只使用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

1
@AvindraGoolcharan尝试进行dns请求
jfs

2

对于拥有登录路由器访问权限的我们来说,使用脚本询问路由器的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请求。


2
您应该尝试以语法方式获取路由器的IP地址。例如router = subprocess.check_output(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2]
Cristian Ciupitu 2014年

2

这些将获取本地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

1
ifconfig | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*addr: *([^ ]+).*/\1,\2/p}'将打印本地接口和相应的V4 IP
Hannu

1
ifconfig | sed -nre '/^[^ ]+/{N;N;s/^([^ ]+).*addr: *([^ ]+).*addr: *([^ ]+).*/\1,\2,\3/p}'-v4和v6 IP。
Hannu 2014年

2

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}\>'

2

如果您使用的是DD-WRT,则对我有用

curl -s 192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: |</span)" '{print $2}'

要么

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

  • -s成分是指沉默(即不显示卷曲进度信息)。

  • 哦,我应该提一下,我将上述内容与“ DD-WRT v24-sp2(01/04/15)std”一起使用

1

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

lynx bot.whatismyipaddress.com

curl bot.whatismyipaddress.com也可以。
Tomofumi 2015年


0

也许我来晚了一点,但是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: <filter>
           WAN IP: <filter>
           IF: eth0 ip-v4: <filter> ip-v6-link: N/A

它说的<filter>是您的WAN IP,IPv4,MAC地址等出现的位置


-2

只需为任何网站或服务发出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脚本是一种好的做法。


这很有趣,尽管确实很慢,并且不会像这样获取我的外部ip
rubo77

这个答案太不准确了。在公司环境中,我根本没有IP地址。唯一可行的方法是,如果您了解本地路由器和交换机的制作方式,那么即使您跳过本地跳数,它也可能不在第2行上。没有办法用这种技术制作出连贯的算法,这里还有许多其他的解决方案,它们更简单,每次都能为您提供正确的答案。
Mike S

尽管它可以在某些特殊配置中工作,但实际上我从未在跟踪路由中看到过我的外部IP。它通常是我的网关(如果我不在NAT之后),或者是我的路由器的网关,但通常是更远的其他路由器。
mivk

别名IP = '猁--dump ipecho.net/plain '
phildobbin

-2

除了8.8.8.8是GOogle DNS外,没有任何依赖性的命令:

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

这只会告诉您本地传出接口的IP地址。
guntbert

如果我在云服务器上运行该命令,则显示公共IP地址。是不是这个问题?
罗夫(Rolf)2015年

不,您在哪里看到“云服务器”?
guntbert
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.