Я хочу записать сценарий для установки IP-адреса устройства, подключенного к интерфейсу как "eth0" к переменной. Я могу получить IP-адрес этой командой:
arp -i eth0 -a
Вывод вышеупомянутой команды:
? (10.42.0.38) at b8:27:eb:07:5d:60 [ether] on eth0
Я хочу добавить сценарий к .bashrc
файл для установки IP-адреса от вывода вышеупомянутой команды к переменной $RASPBERRY_IP
и используйте его в другом сценарии. Какая-либо идея, как сделать это?
arp
управляет записями в кэше ARP ядра, Вы, вероятно, собираетесь добраться, много записей (зависит от размера LAN). Поскольку Вы только интересуетесь IP-адресами, необходимо использовать -n
опция так, чтобы arp
показывает числовые адреса вместо имен хостов сначала.
Также Вы будете обычно получать много IP-адресов, зависящих размер Вашей LAN, таким образом, необходимо будет, вероятно, использовать массив вместо переменной для хранения IP-адресов.
Следующая команда берет IP-адреса из arp
кэш и помещенный их в массив addrs
:
addrs=( $(arp -ni eth0 | grep -o '^[0-9][^ ]*') )
Вот пример:
$ addrs=( $(arp -ni eth0 | grep -o '^[0-9][^ ]*') )
$ echo "${addrs[0]}" ## First IP
192.168.2.27
$ echo "${addrs[2]}" ## Second IP
192.168.1.1
$ echo "${#addrs[@]}" ## Number of IP addresses
37
Можно использовать sed
также:
addrs=( $(arp -ni eth0 | sed -nr 's/^([0-9][^ ]*).*/\1/p') )
IP-адреса покажут в первом столбце, мы извлекаем первый столбец [0-9][^ ]*
. ^[0-9]
здесь должен гарантировать, что строка запускается с числового, таким образом, первая строка, содержащая заголовок, отбрасывается от вывода.
На другой ноте, если у Вас есть только одна запись, можно сохранить ее в переменной вместо этого:
addr="$(arp -ni eth0 | grep -o '^[0-9][^ ]*')"
Или
addr="$(arp -ni eth0 | sed -nr 's/^([0-9][^ ]*).*/\1/p')"
Вот другая идея с помощью awk
arp -ni eth0 | awk 'NR>1 {print $1}'
Пример
$ arp -ni eth0 | awk 'NR>1 {print $1}'
192.168.20.3
192.168.20.1
192.168.20.11
или с переменной
$ addresses=$(arp -ni eth0 | awk 'NR>1 {print $1}')
$ echo $addresses
192.168.20.3 192.168.20.1 192.168.20.11
<час> , Чтобы заставить определенный индекс без массива
$ arp -ni eth0 | awk -v idx=3 'NR>1 && NR==idx+1 {print $1}'
192.168.20.11
получать максимальное значение для idx
arp -ni eth0 | awk 'NR>1 {idx_max++} END {print idx_max}'
Пример
$ idx_max=$(arp -ni eth0 | awk 'NR>1 {idx_max++} END {print idx_max}')
$ echo $idx_max
3