用于网络适配器,IP地址和Mac地址的Raspberry Pi Bash脚本

时间:2019-10-18 12:43:02

标签: bash raspberry-pi

我希望有一个捷径来显示适配器,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}'

我得到了Mac地址

如果我运行此

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

我也将正确获得ipaddress

1 个答案:

答案 0 :(得分:1)

一个小的解决方案就足够了

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命令。例如ip a | sed -n '/^[^ ]*: \([^ ]*\):.*/{s//\1/;p;}'

不需要tr '\n' ' '。 Shell会将任何空格字符(即制表符,空格或换行符)解释为单词分隔符。

相关问题