这将在 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
细节
好吧,看起来这里发生了很多事情,但它非常简单。
- if 语句 - 最初我们需要知道是否存在任何以太网设备,因此我们运行
ifconfig
并 grep 输出寻找一个。如果我们找到一个,那么我们将ifconfig
再次运行并解析它。 - 第二个 ifconfig - 我们现在实际上正在解析输出。我们使用 的
grep
PCRE 工具 (-P
) 来搜索以 ethXX: 开头的字符串。交换机-o
将返回 ethXX: 之后出现的数字。 - 排序 - 然后我们
sort
以数字形式显示结果,以防我们有多个 ethXX:YY 设备。 - tail - 返回最后一个,这将是价值最高的 ethXX:YY 设备。
- 然后我们通过 增加这个数字
$(( $(ifconfig ...) + 1 ))
。因此,如果 ethXX:YY 为 0,我们将得到0 + 1
一个1
. - echo - 然后我们得到
echo
第 5 步的结果。 - 如果输出中不存在 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:0
。eth0:1
这是一个问题,因为您只能有 255 个接口别名。使用ip
iproute2 中的命令,您可以为单个接口分配任意数量的 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
除了名称之外,您不需要了解有关接口当前配置的任何信息。无需计算下一个未使用的接口别名号。