
Это будет в скрипте 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
Если я правильно понял, вам нужна однострочная команда, которая будет брать выходные данные 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
Итак, если у нас есть одно устройство Ethernet:
$ 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
Если у нас нет устройств Ethernet, то мы вернем 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 - изначально нам нужно знать, есть лилюбойУстройства Ethernet, поэтому мы запускаем
ifconfig
и grep вывода в поисках одного. Если мы находим одно, то мы продолжаем запускifconfig
и анализируем его. - 2nd ifconfig - Здесь мы фактически анализируем вывод. Мы используем
grep
PCRE-средство (-P
) для поиска строк, начинающихся с ethXX:. Коммутатор-o
вернет цифру, которая стоит после ethXX:. - сортировка - Затем мы сортируем
sort
результаты в числовом виде, если у нас несколько устройств ethXX:YY. - tail — возвращает последнее, это будет устройство ethXX:YY с наибольшим значением.
- Затем мы увеличиваем это число с помощью
$(( $(ifconfig ...) + 1 ))
. Так что если ethXX:YY равен 0, мы получим0 + 1
в результате1
. - эхо - затем
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
Это не прямой ответ на ваш вопрос, а скорее альтернативное решение.
Альтернативным решением является использованиеiproute2утилиты. ifconfig
устарели и постепенно устаревают. Они неадекватны и не способны полностью управлять сетевым стеком Linux.
Например, как вы знаете, с помощью ifconfig
, вам нужно создать интерфейс псевдонима ( eth0:0
, eth0:1
, и т. д.) для каждого IP, который вы хотите назначить этой машине. Это проблема, так как у вас может быть только 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
Вам не нужно знать ничего о текущей конфигурации интерфейса, кроме его имени. Не нужно вычислять следующий неиспользуемый номер псевдонима интерфейса.