![有没有一种简单的方法以编程方式提取 IP 地址?](https://linux22.com/image/49801/%E6%9C%89%E6%B2%A1%E6%9C%89%E4%B8%80%E7%A7%8D%E7%AE%80%E5%8D%95%E7%9A%84%E6%96%B9%E6%B3%95%E4%BB%A5%E7%BC%96%E7%A8%8B%E6%96%B9%E5%BC%8F%E6%8F%90%E5%8F%96%20IP%20%E5%9C%B0%E5%9D%80%EF%BC%9F%20.png)
有没有一种简单的方法可以以编程方式提取 IP 地址,而无需进行繁琐的解析ifconfig
?我不介意使用简单的命令输出处理来执行此操作,但不介意从某个地方sed
处理多行文件。/etc
我想做的是修改我的.bashrc
以在问候消息中显示主机的 IP 地址。我正在使用Ubuntu 12.04
,但决定在这里发帖而不是 Ubuntu 论坛,因为我认为这不是特定于发行版的。
答案1
笔记
NIC 设备句柄
下面的示例假设网络接口是名为 的无线卡
wlan0
。根据您的具体情况调整示例中的这一点。例如,如果它是有线 NIC 卡,那么很可能是eth0
。IPv4 -(互联网协议版本 4)
这些示例还返回 IPv4 地址。大多数人将其视为“IP 地址”的“点线四边形”。
例如:
inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0
IPv6 -(互联网协议版本 6)
如果您的系统配置为支持 IPv6,您将在输出中看到“点线四边形”以及 IPv6 IP 地址
ifconfig
。例如:
inet6 addr: fe80::226:c7ff:fe85:a720/64 Scope:Link
下面的命令明确忽略这一点,但可以很容易地进行调整以获取此信息。
解决方案(使用ifconfig
)
有很多方法可以做到这一点。例如,您可以使用此awk
脚本解析无线 LAN NIC (wlan0) 的 IP 地址:
$ ifconfig wlan0 | grep "inet " | awk -F'[: ]+' '{ print $4 }'
192.168.1.20
您可以这样做并使其更加紧凑:
$ ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}'
192.168.1.20
您还可以使用perl
:
$ ifconfig wlan0 | perl -nle'/t addr:(\S+)/&&print$1'
192.168.1.20
Perl 示例尽可能紧凑。
还有无数其他方法可以做到这一点,这些只是帮助您入门的几个示例。
编辑#1
一些附加注释和评论。 @StephaneChazelas 证明有一个更紧凑的版本,使用grep
:
$ ifconfig wlan0|grep -Po 't addr:\K[\d.]+'
192.168.1.20
该解决方案利用了grep
较新版本中的 PCRE(Perl 正则表达式)功能,以及它的-o
开关以仅返回与正则表达式匹配的内容。
解决方案(使用ip
)
正如评论中也提到的那样,ifconfig
在为网络设备分配了多个 IP 地址的系统上使用可能会很麻烦,因为它只返回第一个 IP 地址。因此,ip
在这些情况下最好使用该命令。
例如:
$ ip addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20
您还可以指定ip
仅显示给定网络接口的 IPv4 信息。在本例中,我们仅查看名为 的接口wlan0
:
$ ip -f inet addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20
参考
答案2
$ hostname -I
例如:
$ hostname -I
192.168.1.18
信息。来自联机帮助页:
http://manpages.ubuntu.com/manpages/raring/en/man1/hostname.1.html
http://unixhelp.ed.ac.uk/CGI/man-cgi?主机名
答案3
这是另一种使用“ip”的方法,但当您的设备可能连接到不同的接口(例如有时是有线以太网,有时是 WiFi)时,这种方法效果更好。为了多样化,我还使用“sed”代替“grep”或“perl”。
这会找到任何有到 Internet 的路由的源 IP。或者无论如何谷歌的 DNS。
ip -o route get 8.8.8.8 | sed -e 's/^.* src \([^ ]*\) .*$/\1/'