Raspberry Pi Bash Script для сетевого адаптера, IP-адресов и Mac-адресов - PullRequest
0 голосов
/ 18 октября 2019

Я хочу иметь ярлык для отображения адаптера, IP-адреса и Mac-адреса. У меня есть следующее:

#! /bin/bash
for iface in $(ifconfig | grep -v "lo" | cut -d ' ' -f1| tr '\n' ' ')
do 
   ipadd=$(ip -o -4 addr list $iface | awk '{print $4}' | cut -d/ -f1)
   madd=$(ip -o link list $iface | awk '{print $17}')
   printf "$iface\t$ipadd\t$madd\n"
done
  1. Сетевой адаптер не показывает IP-адрес и не отображает такое устройство. Но если я запускаю команду вручную в bash, она работает и появляется. Тот же скрипт работает правильно на моем Ubuntu, но не на Raspberry Pi (работает только ручная команда). wlan0 работает без проблем на Pi

  2. MAC-адрес вообще не работает, но если я запускаю команду вручную ip -o link list <adapter> | awk '{print $17}'), он правильно показывает MAC-адрес.

Пожалуйста, сообщите, где могла произойти ошибка.

Обновление:

+++ ifconfig
+++ grep -v lo
+++ cut -d ' ' -f1
+++ tr '\n' ' '
++ for iface in $(ifconfig | grep -v "lo" | cut -d ' ' -f1| tr '\n' ' ')
+++ ip -o -4 addr list enxb827ebe7229c:
+++ awk '{print $4}'
+++ cut -d/ -f1
Device "enxb827ebe7229c:" does not exist.
++ ipadd=
+++ ip -o -4 link list enxb827ebe7229c:
+++ awk '{print $17}'
Device "enxb827ebe7229c:" does not exist.
++ madd=
++ printf 'enxb827ebe7229c:\t\t\n'
enxb827ebe7229c:        
++ for iface in $(ifconfig | grep -v "lo" | cut -d ' ' -f1| tr '\n' ' ')
+++ ip -o -4 addr list wlan0:
+++ awk '{print $4}'
+++ cut -d/ -f1
++ ipadd=192.168.1.4
+++ ip -o -4 link list wlan0:
+++ awk '{print $17}'
RTNETLINK answers: No such device
Cannot send link get request: No such device
++ madd=
++ printf 'wlan0:\t192.168.1.4\t\n'
wlan0:  192.168.1.4

Если я запускаю команду вручную:

ip -o -4 link list enxb827ebe7229c | awk '{print $17}'

Iполучить Mac-адрес

Если я запусту этот

ip -o addr list enxb827ebe7229c | awk '{print $4}' | cut -d/ -f1

, я тоже получу IP-адрес правильно

1 Ответ

1 голос
/ 18 октября 2019

Достаточно было небольшого исправления:

for iface in $(ifconfig | grep -v "lo:" | cut -d ' ' -f1 | cut -d: -f1); do
     ipadd=$(ip -o -4 addr list $iface | awk '{print $4}' | cut -d/ -f1);
     madd=$(ip -o link list $iface | awk '{print $17}');
     printf "$iface\t$ipadd\t$madd\n";
done

Деталь ifconfig | grep -v "lo:" | cut -d ' ' -f1| tr '\n' ' ' оставляет в выводе символ :, поэтому вы перебираете eth0: eth1:, а не eth0 eth1. Вам нужно удалить :, либо просто cut -d: -f1 или tr -d:, либо любым другим способом.

Также обратите внимание, что, как вы только что обнаружили, вывод ifconfig отличается для разных платформ иреализации. Лучше просто придерживаться новой команды ip. Ex. ip a | sed -n '/^[^ ]*: \([^ ]*\):.*/{s//\1/;p;}'

Нет необходимости в tr '\n' ' '. Оболочка интерпретирует любой символ пробела - то есть символ табуляции, пробел или символ новой строки - как разделитель слов.

...