Сценарий для установки IP-адреса, подключенного к интерфейсу к переменной оболочки

Я хочу записать сценарий для установки 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 и используйте его в другом сценарии. Какая-либо идея, как сделать это?

3
задан 11 August 2015 в 11:52

2 ответа

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')"
5
ответ дан 1 December 2019 в 13:16

Вот другая идея с помощью 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
3
ответ дан 1 December 2019 в 13:16

Другие вопросы по тегам:

Похожие вопросы: