问题描述
如何使用脚本显示 eth0 上显示的 IP 地址?
最佳回答
为了提供另一种选择,您可以使用 ip addr
命令来获取 IP 地址:
ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
-
ip addr show eth0
显示有关eth0
的信息 -
grep "inet\\b"
仅显示具有 IPv4 地址的行(如果需要 IPv6 地址,请将其更改为"inet6\\b"
) -
awk '{print $2}'
在第二个字段上打印,其中包含 ip 地址/掩码,例如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)
次佳回答
注意:此答案适用于较旧的系统。如果这对您不起作用,请考虑其他答案。这个答案并没有错。
将其保存在文件中,然后运行 bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
更准确地只获取显示 IP 地址的数字:
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
更新:如果这不适合您,请尝试 other answer
更新:对于 Ubuntu 18+,请尝试:(不要忘记将 eth0
替换为您需要 IP 的接口。感谢 @ignacio )
ifconfig eth0 | grep "inet " | awk '{print $2}'
第三种回答
取自https://stackoverflow.com/a/14910952/1695680
hostname -i
但是,这可能会返回本地 IP 地址 (127.0.0.1),因此您可能必须使用并过滤:
hostname -I
来自主机名的联机帮助页:
\\n
-i, --ip-address
\\n
Display the network address(es) of the host name. Note that this works only if the host name can be resolved. Avoid using this option; use hostname –all-ip-addresses instead.
\\n
-I, --all-ip-addresses
\\n
Display all network addresses of the host. This option enumerates all configured addresses on all network inter\\u2010faces. The loopback interface and IPv6 link-local addresses are omitted. Contrary to option -i, this option does not depend on name resolution. Do not make any assumptions about the order of the output.
\\n
第四种回答
您应该使用 ip
(而不是 ifconfig
),因为它是最新的、维护的,并且也许最重要的是出于脚本目的,它会产生一致的 & 。可解析的输出。以下是一些类似的方法:
如果您想要以太网接口 eth0
的 IPv4 地址:
$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24
作为脚本:
#!/usr/bin/env bash
INTFC=eth0
MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}')
echo $MYIPV4
将产生:192.168.1.166/24
作为其输出
上面生成的输出位于 CIDR notation. 中。如果不需要 CIDR 表示法,可以将其删除:
$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1
192.168.1.166
恕我直言,”most elegant” 的另一个选项是获取用于连接到指定远程主机的任何接口的 IPv4 地址(在本例中为 8.8.8.8)。由 this answer 中的 @gatoatigrado 提供:
$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166
或者,作为脚本:
#!/usr/bin/env bash
RHOST=8.8.8.8
MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
echo $MYIP
将产生:192.168.1.166
作为其输出
这在具有单个接口的主机上工作得非常好,但更有利的是也可以在具有多个接口和/或路由规范的主机上工作。
虽然 ip
是我的首选方法,但这当然不是给这只 cat 剥皮的唯一方法。如果您喜欢更简单/更简洁的东西,这是使用 hostname
的另一种方法:
$ hostname --all-ip-addresses | awk '{print $1}'
或者,如果您想要 IPv6 地址:
$ hostname --all-ip-addresses | awk '{print $2}'
作为脚本:
#!/usr/bin/env bash
MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}')
MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
echo $MYV4IP
echo $MYV6IP
将产生: 192.168.1.166
和 2601:7c1:103:b27:352e:e151:c7d8:3379
作为其答案(假设您分配了 IPv6 地址)。
第五种回答
@markus-lindberg 的回应是我最喜欢的。如果将 -o -4
添加到 ip 的标志中,那么您将获得更容易解析(且一致)的输出:
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-o
代表 --oneline
,它旨在帮助解决这种情况。添加 -4
是为了限制 IPv4 地址,这是所有其他响应所暗示的内容。
第六种回答
这里有一些单线……
awk
ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'
上述 awk 命令中的 split 函数根据分隔符 :
拆分第二列,并将拆分后的值存储到关联数组 a
中。所以a[2]
保存的是第二部分的值。
sed
ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'
在基本的 sed 中, \\(...\\)
称为捕获组,用于捕获字符。我们可以通过 back-referencing 引用那些捕获的字符。 \\([^[:space:]]\\+\\)
捕获任何字符但不捕获空格一次或多次。
grep
ifconfig eth0 | grep -oP 'inet addr:\K\S+'
\\K
在最后打印时丢弃先前匹配的字符,并且 \\S+
匹配一个或多个非空格字符。
珀尔
ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'
捕获 inet addr:
字符串旁边的一个或多个非空格字符,最后我们仅打印这些捕获的字符。