在eth0接口上显示IP地址


24

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

Answers:


28

将其保存在文件中,然后运行 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

更新:如果这不适用于您,请尝试其他答案


2
当然,这在最新的ubuntu中不起作用。最新的ifconfig返回“INET <IP>”,而不是“INET地址<IP>”
唐卡

您可以使用grep "inet"
Andrei Radulescu

26

为了提供另一个选项,您可以通过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}' 在第二个字段上打印,该字段具有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)

该解决方案实际上有效!
thang '18

ip -4 ...和ip -6 ...!谢谢!
TamusJRoyce

17

取自/programming//a/14910952/1695680

hostname -i

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

hostname -I

从主机名的联机帮助页:

-i, --ip-address

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

-I, --all-ip-addresses

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


从记录ip addr show label 'enp*'ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
来看

5

@ markus-lindberg的回复是我的最爱。如果添加-o -4到ip的标志,那么您将获得更容易解析(一致)的输出:

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

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


爱的ip旗帜。使用cut而不是高级的awk巫术:ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ

@DuffJ这可能取决于个人喜好。我了解了cut之后,便“发现”了方式awk,并且我希望最大限度地减少管道上的命令数量。无论如何都不错的建议。
阿莫斯·夏皮拉

我完全同意,阿莫斯。感谢您的解决方案!
DuffJ

3

这是一些班轮.....

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中,\(...\)称为捕获组,用于捕获字符。我们可以通过反向引用来引用那些捕获的字符。\([^[:space:]]\+\)捕获任何字符,但不捕获空格一次或多次。

grep

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\K从最后打印时丢弃先前匹配的字符,并\S+匹配一个或多个非空格字符。

佩尔

ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'

inet addr:捕获字符串旁边的一个或多个非空格字符,最后我们仅打印那些捕获的字符。


@edwardtorvalds添加了一些解释。我认为这将对将来的读者有所帮助。随时问上述命令中的任何问题... :)
Avinash Raj

2

这是一个很好的例子,仅将grep用作辅助命令:

ip addr显示eth0 | grep -oP'inet \ K \ S [0-9。] +'

我不明白为什么您应该使用比所需更多的命令


2

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

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

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

作为脚本:

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

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

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

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

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

作为脚本:

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

这在具有单个接口的主机上可以很好地工作,但是更有利的是,在具有多个接口和/或路由规范的主机上也可以工作。

虽然ip这是我的首选方法,但它肯定不是给这只猫剥皮的唯一方法。hostname如果您希望更简单/更简洁的方法,这是另一种使用的方法:

$ hostname --all-ip-addresses | awk '{print $1}'  

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

$ hostname --all-ip-addresses | awk '{print $2}'  

作为脚本:

$ 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

1

我建议使用专门为该目的而设计的python库(如netifaces)

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

获取正在使用的默认网络接口。

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]


1

如果您没有awk,那么只有一个更有用的选项(在某些嵌入式设备中就是这种情况):

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"


1

这是针对IPv4的

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

这是针对IPv4和特定开发人员(eth0)的:

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

对于 IPv6

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"


0

普通用户也可以使用。

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6

他要求eth0,此脚本版本可能会有所帮助(还显示环回tho)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt

这是几乎相同的答案askubuntu.com/a/560466/367990,只是用cut的,而不是一个组合两次awk,并cut解析输出。下次您最好先检查所有其他答案,并确保不要发布重复的解决方案。在这种情况下,我认为它是重复的还是相似的还是有争议的,因此请把它作为一般提示。谢谢。
字节指挥官

0

这是我能找到的最短方法:

ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'

替换$1为您的网络接口。

ip -f inet 告诉ip仅返回inet(ipv4)系列的值。

grep -Po 告诉grep将下一个值作为perl-regex进行运算,并且仅打印匹配的值。

正则表达式\K[\d.]+表示“丢弃所有内容,直到该点(\ K),并匹配尽可能多的数字值,并在其后尽可能一行地插入一个点”。因此,这将仅匹配IP地址,并忽略其后的所有内容,包括简短的\ XX子网掩码。


0

在这些日子里,使用多个接口(例如,如果您使用泊坞窗),并且以ETH命名接口已不再是规范

我使用此命令提取IP /掩码:

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

因此,无论我将拥有多少个接口以及它们的名称如何,GREP只会抢先拥有MULTICAST选项的接口。

我使用此命令仅提取不带掩码的IP:

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

我在不同的BDS和NIX上使用这些命令,它永远不会失败;)


如果您要解析的输出ip,请使用-o选项。
muru 17-10-26

0

在我的脚本中,我使用的是这样的:

re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Cannot determin IP" 1>&2
fi

它不会产生任何进程。


0

还有另一种方式(假设您不需要CIDR地址,也不需要IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • 使用 ip不是deprecated
  • 仅使用一个命令进行过滤
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.