有没有一种简单的方法以编程方式提取 IP 地址?

有没有一种简单的方法以编程方式提取 IP 地址?

有没有一种简单的方法可以以编程方式提取 IP 地址,而无需进行繁琐的解析ifconfig?我不介意使用简单的命令输出处理来执行此操作,但不介意从某个地方sed处理多行文件。/etc我想做的是修改我的.bashrc以在问候消息中显示主机的 IP 地址。我正在使用Ubuntu 12.04,但决定在这里发帖而不是 Ubuntu 论坛,因为我认为这不是特定于发行版的。

答案1

笔记

  1. NIC 设备句柄

    下面的示例假设网络接口是名为 的无线卡wlan0。根据您的具体情况调整示例中的这一点。例如,如果它是有线 NIC 卡,那么很可能是eth0

  2. IPv4 -(互联网协议版本 4)

    这些示例还返回 IPv4 地址。大多数人将其视为“IP 地址”的“点线四边形”。

    例如:

    inet addr:192.168.1.20  Bcast:192.168.1.255  Mask:255.255.255.0
    
  3. 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/'

相关内容