从 init.d 脚本的配置文件 (/etc/network/interfaces) 中获取值

Get a value from a config file (/etc/network/interfaces) for an init.d script

我想从我的 /etc/network/interfaces 文件中获取网络地址 (192.168.42.)。 我只对接口 "wlan0" 感兴趣,最好检查一下下面的部分是否存在。

在 "wlan0" 的示例接口文件中,IP 地址为 192.168.42.1。对于 init.d 脚本,我随后想用 *.255 替换最后一个字节 (*.1)。所以 IP 应该是:“192.168.42.255”

有人知道如何从这样的文件中为 init.d 脚本读取网络地址并替换最后一个字节吗?

iface wlan0 inet static
  address 192.168.42.1
  netmask 255.255.255.0

目前我只知道如何判断文件是否存在

# Check for existence of needed config file and read it
test -r $CONFIGF || { echo "$CONFIGF not existing";
    if [ "" = "stop" ]; then exit 0;
    else exit 6; fi; }

我会为此使用 awk,因为它非常易读:

awk -v par="wlan0" '
      /^iface/ && ==par {f=1}
      /^iface/ && !=par {f=0}
      f && /^\s*address/ {print ; f=0}' file

说明

  • -v par="wlan0" 提供您要检查的接口名称
  • /^iface/ && ==par {f=1} 如果一行以 iface 开头并且第二个值是给定的接口名称,则设置一个标志。
  • /^iface/ && !=par {f=0} 如果一行以 iface 开头并且第二个值不是给定的接口名称,则取消设置标志。
  • f && /^\s*address/ {print ; f=0} 如果设置了标志并且一行以 address 开头,则打印第二个黑色,作为 IP。然后,重置计数器(感谢 Etan Reisner 的想法)。

请注意,这会检查这些行是否未被注释。

如果你想把最后一个.1替换成.255,你可以把最后一个条件替换成这样:

f && /^\s*address/ {ip=; sub(".1$", ".255", ip); print ip; f=0}
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

测试

根据您的输入给出一个文件:

$ cat a
iface eth0 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.255.0

iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0

iface eth1 inet static
address yyy.yyy.yyy.yyy
netmask 255.255.255.0

它returns:

$ awk -v par="wlan0" '/^iface/ && ==par {f=1} /^iface/ && !=par {f=0} f && /^\s*address/ {print ; f=0}' a
192.168.42.1

并替换 ip 的最后一部分:

$ awk -v par="wlan0" '/^iface/ && ==par {f=1} /^iface/ && !=par {f=0} f && /^\s*address/ {ip=; sub(".1$", ".255", ip); print ip; f=0}' a
192.168.42.255