如何使用shell脚本显示eth0接口的IP地址?

use*_*389 32 scripts interface ip

如何使用脚本显示 eth0 上显示的 IP 地址?

Ala*_*Ali 40

为了提供另一个选项,您可以通过ip addr这种方式使用该命令来获取 IP 地址:

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
Run Code Online (Sandbox Code Playgroud)
  • ip addr show eth0 显示有关的信息 eth0
  • grep "inet\b"仅显示具有 IPv4 地址的行(如果您想要 IPv6 地址,请将其更改为"inet6\b"
  • awk '{print $2}' 打印在具有 ipaddress/mask 的第二个字段上,例如 172.20.20.15/25
  • cut -d/ -f1 只取 IP 地址部分。

在脚本中:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
Run Code Online (Sandbox Code Playgroud)


Edw*_*lds 31

注意:此答案适用于较旧的系统。如果这对您不起作用,请考虑其他答案。这个答案并没有错。

将其保存在一个文件中,然后运行 bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"
Run Code Online (Sandbox Code Playgroud)

更准确地获取仅显示 IP 地址的数字:

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
Run Code Online (Sandbox Code Playgroud)

更新:如果这对您不起作用,请尝试其他答案

更新:对于 Ubuntu 18+,请尝试:(不要忘记替换eth0为您需要 IP 的接口。感谢@ignacio)

ifconfig eth0 | grep "inet " | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

  • 当然,这在最新的 ubuntu 中不起作用。最新的 ifconfig 返回“inet &lt;ip&gt;”而不是“inet addr &lt;ip&gt;” (4认同)
  • 你可以只使用`grep“inet”` (2认同)
  • `Ubuntu 18.04` 的快速更新:`ifconfig wlan0 | grep "inet" | awk '{print $2}'` (2认同)

Tho*_*ner 25

摘自/sf/answers/1043766671/

hostname -i
Run Code Online (Sandbox Code Playgroud)

但是,这可能会返回本地 IP 地址 (127.0.0.1),因此您可能必须使用并过滤:

hostname -I
Run Code Online (Sandbox Code Playgroud)

从主机名的联机帮助页:

-i, --ip-address

显示主机名的网络地址。请注意,这仅在可以解析主机名时才有效。避免使用此选项;改用主机名 --all-ip-addresses。

-I, --all-ip-addresses

显示主机的所有网络地址。此选项枚举所有网络接口上的所有配置地址。环回接口和 IPv6 链路本地地址被省略。与选项 -i 相反,此选项不依赖于名称解析。不要对输出的顺序做任何假设。


Amo*_*ira 8

@markus-lindberg 的回答是我最喜欢的。如果你添加-o -4到 ip 的标志,那么你会得到一个更容易解析(和一致)的输出:

ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
Run Code Online (Sandbox Code Playgroud)

-o代表--oneline,这意味着在这种情况下提供帮助。将-4被添加到限制的IPv4地址,这是所有其他答复暗示。


Sea*_*mus 5

您应该使用ip(而不是ifconfig),因为它是当前的、维护的,也许最重要的是用于脚本目的,它会产生一致且可解析的输出。以下是一些类似的方法:

如果您想要以太网接口的 IPv4 地址eth0

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  
Run Code Online (Sandbox Code Playgroud)

作为脚本:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

Run Code Online (Sandbox Code Playgroud)

上面产生的输出采用CIDR 表示法。如果不需要 CIDR 表示法,则可以将其删除:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  
Run Code Online (Sandbox Code Playgroud)

恕我直言“最优雅”的另一个选项是获取用于连接到指定远程主机(在这种情况下为 8.8.8.8)的任何接口的 IPv4 地址。在此答案中由@gatoatigrado 提供:

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166
Run Code Online (Sandbox Code Playgroud)

作为脚本:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166
Run Code Online (Sandbox Code Playgroud)

这在具有单个接口的主机上非常有效,但更有利的是也适用于具有多个接口和/或路由规范的主机。

虽然ip这是我的首选方法,但这肯定不是给这只猫剥皮的唯一方法。hostname如果您更喜欢更简单/更简洁的内容,则可以使用另一种方法:

$ hostname --all-ip-addresses | awk '{print $1}'  
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要 IPv6 地址:

$ hostname --all-ip-addresses | awk '{print $2}'  
Run Code Online (Sandbox Code Playgroud)

作为脚本:

$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}') 
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166 
$ echo $MYV6IP 
2601:7c1:103:b27:352e:e151:c7d8:3379
Run Code Online (Sandbox Code Playgroud)