如果我向google查询,我可以看到我的公共IP。Ubuntu命令行上有什么可以给我同样的答案吗?
notify-send
。
ifconfig eth1 | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*inet *([^ ]+).*/\2/p}'
eth1是您感兴趣的网络设备,您可以省略'et1'字符串以显示所有适配器的所有ip。取而代之的是\2
您也可以写出\1 \2
每个适配器的名称。
如果我向google查询,我可以看到我的公共IP。Ubuntu命令行上有什么可以给我同样的答案吗?
notify-send
。
ifconfig eth1 | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*inet *([^ ]+).*/\2/p}'
eth1是您感兴趣的网络设备,您可以省略'et1'字符串以显示所有适配器的所有ip。取而代之的是\2
您也可以写出\1 \2
每个适配器的名称。
Answers:
如果您不在路由器后面,可以使用找到它ifconfig
。
如果您在路由器后面,则由于路由器执行网络地址转换,因此您的计算机将不知道公用IP地址。您可以询问某个网站您的公共IP地址正在使用什么,curl
或者wget
从中提取所需的信息:
curl -s https://checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
或更短
curl https://ipinfo.io/ip
curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
这里列出了其他可能性: go2linux.org/what-is-my-public-ip-address-with-linux
要查找外部ip,可以使用基于外部Web的服务,也可以使用基于系统的方法。一种简单的方法是使用外部服务,而且ifconfig
只有当您不使用时,基于基础的解决方案才能在您的系统中工作NAT
。下面将详细讨论这两种方法。
最简单的方法是通过命令行浏览器或下载工具使用外部服务。由于wget
Ubuntu默认情况下可用,因此我们可以使用它。
要找到您的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
dig
与OpenDNS
as一起使用的更快(可以说是最快)的方法:这里的其他答案都是通过HTTP到达远程服务器的。其中一些需要解析输出,或者依靠User-Agent标头使服务器以纯文本格式响应。它们还经常更改(向下更改名称,放置广告,可能更改输出格式等)。
- DNS响应协议是标准化的(格式将保持兼容)。
- 从历史上看,DNS服务(OpenDNS,Google Public DNS等)比今天流行的任何新的whatismyip.com HTTP服务都倾向于生存更长的时间,并且更稳定,可扩展且通常得到照顾。
- (对于那些关注微优化的极客),这种方法本质上应该更快(因为只有几微秒)。
使用带有OpenDNS的dig作为解析器:
$ dig +short myip.opendns.com @resolver1.opendns.com
111.222.333.444
复制自: https : //unix.stackexchange.com/a/81699/14497
在终端中输入以下内容:
$ LANG=c ifconfig <interface_name> | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'
在上文中,替换<interface_name>
为您的实际接口的名称,如: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
注意:输出是指示性的,不是真实的。
礼貌: https : //www.if-not-true-then-false.com/2010/linux-get-ip-address/
更新
LANG=c
已添加到ifconfig
基本用法中,因此无论语言环境设置如何,它始终提供英语输出。sudo apt-get install wget
-w
curl选项而不是echo :)curl -w '\n' ident.me
我最喜欢的一直是:
curl ifconfig.me
简单,易于输入。
您将必须先安装curl;)
如果ifconfig.me出现故障,请尝试icanhazip.com和/或ipecho.net
curl icanhazip.com
要么
curl ipecho.net
ifconfig.me
似乎比慢ipecho.net
。
curl
,但有wget
:wget -U curl -qO- ifconfig.me
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
time curl http://checkip.amazonaws.com
-> 0.91s
vs .241s
for ident.me
让我们祈祷aws不会
您可以使用DNS请求而不是HTTP请求来查找您的公共IP:
$ dig +short myip.opendns.com @resolver1.opendns.com
它使用resolver1.opendns.com
dns服务器将神奇的myip.opendns.com
主机名解析为您的 IP地址。
curl icanhazip.com
。该curl
版本的平均值:174毫秒。仅DNS版本的平均值:9毫秒。快19倍。另请参见:unix.stackexchange.com/a/81699/8383
curl
它本身比慢,我也不会感到惊讶dig
。即使它们被重写为尽可能相似,curl
也仍然会变慢。它使用HTTP(包括 DNS),并且dig
仅使用DNS。
亚马逊AWS
curl http://checkip.amazonaws.com
样本输出:
123.123.123.123
我喜欢它因为:
我正在使用的是:
wget -O - -q icanhazip.com
是的,您可以使用ip :-)
curl icanhazip.com
有时wget
是唯一可用的,但有时也没有wget
,并且curl
是您唯一的选择(例如OS / X)。两种方法curl icanhazip.com
几乎都一样容易,curl ifconfig.me
但更有趣;-)
准确键入此内容,然后Enter在指示的位置按:
telnet ipecho.net 80
Enter
GET /plain HTTP/1.1
Enter
HOST: ipecho.net
Enter
BROWSER: web-kit
Enter
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
为此,发明了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
和进行后处理使用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的粘贴内容。从答案中仅取出代表外部IP的四个字节,然后进行清理和打印。
工作正常,但不建议用于生产环境:-)
PS许多STUN服务器可用,因为它是SIP和WebRTC的核心技术。从Mozilla使用一个应该是安全的隐私保护措施,但是您也可以使用另一个:STUN服务器列表
你可以只使用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
是最快的,我
对于拥有登录路由器访问权限的我们来说,使用脚本询问路由器的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请求。
router = subprocess.check_output(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2]
。
ifconfig
或更短的输出:
ifconfig | grep inet
也
ip addr show
可能:
hostname -I
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
ifconfig | sed -nre '/^[^ ]+/{N;N;s/^([^ ]+).*addr: *([^ ]+).*addr: *([^ ]+).*/\1,\2,\3/p}'
-v4和v6 IP。
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}\>'
如果您使用的是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成分是指沉默(即不显示卷曲进度信息)。
如果您已在Ubuntu类型中安装lynx
lynx bot.whatismyipaddress.com
curl bot.whatismyipaddress.com
也可以。
也许我来晚了一点,但是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地址等出现的位置
只需为任何网站或服务发出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}')