根据这个答案以及网络上的许多其他教程,ifconfig
将列出大量有趣且有用的信息。而且,这似乎是查找我的网络掩码等信息的标准方法。
但是,对于脚本,我需要仅有的网络掩码本身eth0
;并且man ifconfig
对这个问题没有帮助。
我正在使用 VPS,因此无法控制我的网络掩码;我需要查出它被设置为什么。
(注意:虽然我需要eth0
,但有些机器可能有另一个,比如eth1
或ens3
,这也会很有用。)
- 我愿意不是需要网络掩码所在的整行:
inet 111.222.333.444 netmask 255.255.255.0 broadcast 111.222.555.666
- 我想要避免一种“黑客门”方法,比如让
netmask 255.255.255.0
他们运行,sed "s/netmask //"
因为东西可能会发生变化——除非专家这么说
答案1
这可能就是你所需要的(请注意,这在 Ubuntu 16.04 上不起作用):
#!/bin/bash
IFACE='eth0'
ifconfig | grep -A 7 "$IFACE" | sed -nr 's/^.*netmask\s([0-9\.]+)\s\sbroadcast.*$/\1/p'
在第一行中,网络接口的名称被分配为变量的值$IFACE
- 这对于脚本很有用,否则您可以使用grep -A 7 'eth0'
。
在第二行中,命令的输出ifconfig
将通过管道传输到grep
命令,其中选项-A 7
将在匹配的字符串/正则表达式的行后输出以下 7 行。该命令的输出将通过管道传输到sed
。
在sed
命令中:
正则表达式
^.*netmask\s(.*)\s\sbroadcast.*$
将匹配从头到尾^
包含$
一些字符.*
和“关键字”的整行netmask\space
,[0-9\.]+
和\s\sbroadcast
按照这个顺序;该行将被替换为第一个捕获组 [ -> ]
s/old/new/
的内容(),其中正则表达式将匹配由数字结尾点组成的字符串;(.*)
\1
[0-9\.]+
选项
-r
(或-E
)将启用扩展正则表达式,在这种情况下,我们可以自由使用圆括号;-n
与 标志组合的选项p
仅输出匹配的行并保留其余输出sed
。
这是一个扩展的示例,它将解析所有网络接口的名称并对每个网络接口执行与上述命令类似的操作:
for IFACE in $(ifconfig | sed -nr 's/(^[a-z0-9]+):.*/\1/p'); do \
echo -en "${IFACE}:\t"; ifconfig | \
grep -A 7 "$IFACE" | \
sed 's/ broadcast.*$//' | \
sed -rn 's/^.*netmask (.*)$/\1/p'; \
done
在装有 Ubuntu 18.04 的虚拟机上执行上述命令的示例输出:
$ for IFACE in $(ifconfig | sed -nr 's/(^[a-z0-9]+):.*/\1/p'); do echo -en "${IFACE}:\t"; ifconfig | grep -A 7 "$IFACE" | sed 's/..broadcast.*$//' | sed -rn 's/^.*netmask (.*)$/\1/p'; done
ens33: 255.255.255.0
lo: 255.0.0.0