用于确定我的公共 IP 的命令?

kfm*_*e04 750 networking

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

Mic*_*l K 1059

如果您不在路由器后面,则可以使用ifconfig.

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

curl -s https://checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'  
Run Code Online (Sandbox Code Playgroud)

或更短

curl https://ipinfo.io/ip
Run Code Online (Sandbox Code Playgroud)

  • curl -s http://ipinfo.io/ip (41认同)
  • ty - 在我发布之后,我意识到我没有先用谷歌搜索答案:看起来这会起作用`curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/&lt;.*$//'` 这里列出了其他可能性:http://www.go2linux.org/what-is-my-public-ip-address-with-linux (28认同)
  • 正如 Giovanni P 所说的那样。OP 应该更改接受的 anwser。 (2认同)

saj*_*i89 408

要查找外部 ip,您可以使用外部基于 Web 的服务,也可以使用基于系统的方法。更容易的是使用外部服务,而且ifconfig只有当您不支持NAT. 下面详细讨论了这两种方法。

使用外部服务查找外部 IP

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

$ wget -qO- https://ipecho.net/plain ; echo
Run Code Online (Sandbox Code Playgroud)

礼貌

您还可以使用lynx(browser) 或curl代替wget上述命令的微小变化来查找您的外部 ip。

使用curl要查找IP:

$ curl https://ipecho.net/plain
Run Code Online (Sandbox Code Playgroud)

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

$ curl https://ipecho.net/plain ; echo
Run Code Online (Sandbox Code Playgroud)

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

这里的其他答案都通过 HTTP 传输到远程服务器。其中一些需要解析输出,或者依靠 User-Agent 标头使服务器以纯文本形式响应。他们也经常改变(下台、改名、张贴广告、可能改变输出格式等)。

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

使用 dig 和 OpenDNS 作为解析器:

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

111.222.333.444
Run Code Online (Sandbox Code Playgroud)

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

不依赖外部服务寻找外部IP

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

在终端中键入以下内容:

$ LANG=c ifconfig <interface_name> | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

在上文中,替换<interface_name>为您的实际接口的名称,如:eth0eth1pp0,等...

示例用法:

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

在您的终端中键入以下内容(这将获取您系统中每个网络接口的名称和 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 }'
Run Code Online (Sandbox Code Playgroud)

示例用法:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

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

更新

  1. LANG=c已添加到ifconfig基于用法中,因此无论区域设置如何,它始终提供英文输出。

  • 如果您不在 NAT 后面,则带有 ifconfig 的命令才有效。 (14认同)
  • 没有外部服务的最后一个版本仅适用于,如果您的计算机**直接**连接到互联网,这种情况很少发生,否则您只能获得本地 IP 地址。 (4认同)
  • 这个使用 dig 的提议非常好 http://unix.stackexchange.com/questions/22615/how-can-i-get-my-external-ip-address-in-bash (3认同)
  • 只需使用 `-w` curl 选项而不是 echo :) `curl -w '\n' ident.me` (2认同)

Pan*_*her 135

我最喜欢的一直是:

curl ifconfig.me
Run Code Online (Sandbox Code Playgroud)

简单,易于打字。

您必须先安装 curl ;)

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

curl icanhazip.com
Run Code Online (Sandbox Code Playgroud)

或者

curl ipecho.net
Run Code Online (Sandbox Code Playgroud)

  • `ifconfig.me` 的响应时间似乎比 `ipecho.net` 慢很多。 (7认同)
  • @Z9iT,我现在刚刚检查过。是的,它会在您的终端中输出外部 IP。 (3认同)
  • 如果你没有 `curl` 但有 `wget`:`wget -U curl -qO- ifconfig.me` (3认同)
  • ifconfig.me 似乎没有响应:( (2认同)

ypr*_*rez 65

icanhazip.com是我的最爱。

curl icanhazip.com
Run Code Online (Sandbox Code Playgroud)

您可以明确请求 IPv4:

curl ipv4.icanhazip.com
Run Code Online (Sandbox Code Playgroud)

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

wget -qO- icanhazip.com
Run Code Online (Sandbox Code Playgroud)


小智 52

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

它的 API 位于http://api.ident.me/

例子:

curl ident.me
curl v4.ident.me
curl v6.ident.me
Run Code Online (Sandbox Code Playgroud)

  • 荣誉!2 年,您仍在维护它。做得好。当我需要 IP 检查时,我想到的是“IDENTify ME” :) (2认同)
  • aws 更快 `time curl http://checkip.amazonaws.com` -&gt; `0.91s` vs `.241s` for `ident.me` 让我们祈祷 aws 不会崩溃;) (2认同)

jfs*_*jfs 51

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

$ dig +short myip.opendns.com @resolver1.opendns.com
Run Code Online (Sandbox Code Playgroud)

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

  • 这_真的_快了。我做了一次热身执行,然后每个执行 10 次和 `curl icanhazip.com`。`curl` 版本的平均值:174 毫秒。仅 DNS 版本的平均值:9 毫秒。快 19 倍。另见:http://unix.stackexchange.com/a/81699/8383 (3认同)

Cir*_*郝海东 31

亚马逊AWS

curl https://checkip.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

示例输出:

123.123.123.123
Run Code Online (Sandbox Code Playgroud)

也适用于浏览器:http : //checkip.amazonaws.com

我喜欢它因为:

  • 它只返回回复正文中的纯文本 IP,没有别的
  • 它来自一家知名提供商,不太可能很快下线


jfl*_*mme 19

我正在使用的是:

wget -O - -q icanhazip.com
Run Code Online (Sandbox Code Playgroud)

是的,你可以拥有 ip :-)

  • 我更喜欢 `curl icanhazip.com` 有时 `wget` 是唯一可用的,但有时也没有可用的 `wget` 而 `curl` 是你唯一的选择(如 OS/X)。无论哪种方式,`curl icanhazip.com` 几乎和 `curl ifconfig.me` 一样简单,但更有趣 ;-) (3认同)

小智 13

准确地输入这个,按Enter指示的地方:

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

这将手动提交一个 HTTP 请求,它将在底部返回您的 IP 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
Run Code Online (Sandbox Code Playgroud)

  • 很好,这很好用,不必安装 curl 对我来说是一个优势:一个 liner: printf "GET /plain HTTP/1.1\nHOST: ipecho.net\nBROWSER: web-kit\n\n" | nc ipecho.net 80 (6认同)

小智 12

为此,发明了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
Run Code Online (Sandbox Code Playgroud)

哪里A.B.C.D是您的机器在本地网络W.X.Y.Z上的 IP 地址,是从外部看到的网站(以及您正在寻找的)之类的 IP 地址服务器。使用sed您可以将上面的输出减少到只有一个 IP 地址:

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

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

使用 bash

甲STUN请求可以手工使用发送到外部STUN服务器netcat,并使用被处理后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/'
Run Code Online (Sandbox Code Playgroud)

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

工作,但不推荐用于生产用途:-)

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

  • +1 代表最极客且实际上最合适的技术。http 查询是有效的,这是我一生都在使用的,但我喜欢实际上对这个问题进行了一些思考。我不知道这个。谢谢! (2认同)

Moh*_*ish 10

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

curl ipecho.net/plain
Run Code Online (Sandbox Code Playgroud)


小智 8

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

telnet myip.gelma.net

Your IPv4: xxx.xxx.xxx.xxx
Your IPv6: ::ffff:xxxx:xxxx
Run Code Online (Sandbox Code Playgroud)

随意使用它。


jfs*_*jfs 7

您可以仅使用 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
Run Code Online (Sandbox Code Playgroud)