当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

如何使用脚本显示 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.1662601: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: 字符串旁边的一个或多个非空格字符,最后我们仅打印这些捕获的字符。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13799.html,未经允许,请勿转载。