使用 ifconfig eth:xx 添加 IP 时,如何在一行中找到最高的 eth:xx

使用 ifconfig eth:xx 添加 IP 时,如何在一行中找到最高的 eth:xx

这将在 Perl 脚本中,我需要获取该数字并为新 IP 将其加一。有人给我一份内衬吗?可以是 Bash/Perl。

编辑

给出以下输入。

inet xx.182.137.90/29 brd xxx.182.137.95 scope global eth0
inet xxx.182.137.91/24 brd xxx.182.137.255 scope global eth0:1
inet xxx.182.137.92/24 brd xxx.182.137.255 scope global secondary eth0:2
inet xxx.182.137.93/24 brd xxx.182.137.255 scope global secondary eth0:3
inet xxx.182.137.94/24 brd xxx.182.137.255 scope global secondary eth0:4

它应该输出 4。鉴于你在下面给我的内容

$ ip addr | grep -e 'eth[0-9]:[0-9]' | cut -d: -f2

如果您更改对此的答案,我会接受它,因为它帮助我得到了这个。

答案1

如果配置

如果我明白您的要求,您需要一个单行命令来获取输出ifconfig并返回下一个要使用的 eth:xx 设备。

那么如果我们使用 eth0:0、eth0:1 和 eth0:2,命令应该返回 3?

例子

像这样的命令应该可以完成您想要的操作。

$ if (ifconfig | grep -q "^eth"); then \
      echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
      else echo 0;fi

因此,如果我们有一个以太网设备:

$ ifconfig | grep eth
eth0:0      Link encap:Ethernet  HWaddr F0:DE:F1:2F:7D:4E  

我们的命令将返回 1:

$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
1

如果我们没有以太网设备,那么我们将返回 0:

$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
0

细节

好吧,看起来这里发生了很多事情,但它非常简单。

  1. if 语句 - 最初我们需要知道是否存在任何以太网设备,因此我们运行ifconfig并 grep 输出寻找一个。如果我们找到一个,那么我们将ifconfig再次运行并解析它。
  2. 第二个 ifconfig - 我们现在实际上正在解析输出。我们使用 的grepPCRE 工具 ( -P) 来搜索以 ethXX: 开头的字符串。交换机-o将返回 ethXX: 之后出现的数字。
  3. 排序 - 然后我们sort以数字形式显示结果,以防我们有多个 ethXX:YY 设备。
  4. tail - 返回最后一个,这将是价值最高的 ethXX:YY 设备。
  5. 然后我们通过 增加这个数字$(( $(ifconfig ...) + 1 ))。因此,如果 ethXX:YY 为 0,我们将得到0 + 1一个1.
  6. echo - 然后我们得到echo第 5 步的结果。
  7. 如果输出中不存在 eth 设备ifconfig,则返回 0,因为这将是第一个。

IP地址

如果您想使用ip addr,您可以使用上面提供的解决方案的这种形式来执行此操作。

$ if (ip addr | grep -q "eth"); then \
      echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
      else echo 0;fi

例子

使用您的样本数据:

inet xx.182.137.90/29 brd xxx.182.137.95 scope global eth0
inet xxx.182.137.91/24 brd xxx.182.137.255 scope global eth0:1
inet xxx.182.137.92/24 brd xxx.182.137.255 scope global secondary eth0:2
inet xxx.182.137.93/24 brd xxx.182.137.255 scope global secondary eth0:3
inet xxx.182.137.94/24 brd xxx.182.137.255 scope global secondary eth0:4

该命令将返回 5:

$ if (ip addr | grep -q "eth"); then echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
5

答案2

这不是对您问题的直接答案,而是更多的替代解决方案。

替代解决方案是使用ip路由2公用事业。ifconfig是古老的并且慢慢被弃用。它是不够的,并且无法完全操纵 Linux 网络堆栈。

例如,正如您所知ifconfig,您必须为要分配给该计算机的每个 IP 创建一个别名接口( 、 等)eth0:0eth0:1这是一个问题,因为您只能有 255 个接口别名。使用ipiproute2 中的命令,您可以为单个接口分配任意数量的 IP。

用法示例:

# ip addr show dev enp5s0
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:97:5a:4e:d5:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.20/24 brd 192.168.0.255 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba97:5aff:fe4e:d54e/64 scope link 
       valid_lft forever preferred_lft forever

# ip addr add 10.0.0.1/24 dev enp5s0

# ip addr show dev enp5s0
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:97:5a:4e:d5:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.20/24 brd 192.168.0.255 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet 10.0.0.1/24 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba97:5aff:fe4e:d54e/64 scope link 
       valid_lft forever preferred_lft forever

除了名称之外,您不需要了解有关接口当前配置的任何信息。无需计算下一个未使用的接口别名号。

相关内容