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

amp*_*ent 47 shell networking ip

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

slm*_*slm 53

笔记

  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. IPv6 -(互联网协议版本 6)

    如果您的系统配置为支持 IPv6,您将在ifconfig输出中看到“虚线四边形”和 IPv6 IP 地址。

    例如:

    inet6 addr: fe80::226:c7ff:fe85:a720/64 Scope:Link
    
    Run Code Online (Sandbox Code Playgroud)

    下面的命令明确忽略这一点,但可以很容易地进行调整以获取此信息。

解决方案(使用ifconfig

有很多方法可以做到这一点。例如,您可以使用此awk脚本来解析无线 LAN NIC (wlan0) 的 IP 地址:

$ ifconfig wlan0 | grep "inet " | awk -F'[: ]+' '{ print $4 }'
192.168.1.20
Run Code Online (Sandbox Code Playgroud)

您可以这样做并使其更紧凑:

$ ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}'
192.168.1.20
Run Code Online (Sandbox Code Playgroud)

你也可以使用perl

$ ifconfig wlan0 | perl -nle'/t addr:(\S+)/&&print$1'
192.168.1.20
Run Code Online (Sandbox Code Playgroud)

Perl 示例非常紧凑。

有无数其他方法可以做到这一点,这些只是帮助您入门的几个示例。

编辑#1

一些额外的注释和评论。@StephaneChazelas 证明有一个更紧凑的版本使用grep

$ ifconfig wlan0|grep -Po 't addr:\K[\d.]+'
192.168.1.20
Run Code Online (Sandbox Code Playgroud)

该解决方案利用grep's 在较新版本中使用 PCRE(Perl 正则表达式)的能力,以及它的-oswitch 以返回与正则表达式匹配的内容。

解决方案(使用ip

正如评论中还提到的,在将ifconfig多个 IP 地址分配给网络设备的系统上使用可能会很麻烦,因为它只返回第一个。所以ip在这些情况下最好使用该命令。

例如:

$ ip addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20
Run Code Online (Sandbox Code Playgroud)

您还可以告诉ip您只显示给定网络接口的 IPv4 信息。在这种情况下,我们只查看名为 的接口wlan0

$ ip -f inet addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20
Run Code Online (Sandbox Code Playgroud)

参考

  • 请注意,它返回接口的 _first_ IPv4 地址。接口可以有多个 IP 地址。你需要 `ip addr show` 来查看所有这些,因为 `ifconfig` 只显示其中之一。 (3认同)
  • @amphibient - 很高兴听到它解决了您的问题。谢谢你的提问。 (2认同)
  • GNU `grep` 更短: `ifconfig eth0|grep -Po 't addr:\K[\d.]+'` 如果接口没有地址,它的优点是返回非零退出状态。 (2认同)

小智 29

$ hostname -I

例如:

$ hostname -I
192.168.1.18
Run Code Online (Sandbox Code Playgroud)

信息。从联机帮助页:

http://manpages.ubuntu.com/manpages/raring/en/man1/hostname.1.html
http://unixhelp.ed.ac.uk/CGI/man-cgi?hostname

  • 不要在 Solaris 主机上运行此命令,除非您希望将主机名更改为 `-I`。 (4认同)
  • Ubuntu 是 Linux 的一种风格:你永远不应该认为它是默认的...... (2认同)

Zan*_*ynx 10

这是另一个使用“ip”的方法,但当您的设备可能连接到不同的接口时效果更好,例如有时是有线以太网,有时是 WiFi。我还使用了“sed”而不是“grep”或“perl”,以实现多样性。

这将找到任何源 IP 具有到 Internet 的路由。或者无论如何都可以访问 Google 的 DNS。

ip -o route get 8.8.8.8 | sed -e 's/^.* src \([^ ]*\) .*$/\1/'
Run Code Online (Sandbox Code Playgroud)