在Bash脚本中获取以太网设备名称列表

时间:2019-02-19 08:35:31

标签: linux bash

我正在尝试创建一个bash脚本,该脚本在我的PC而非无线网卡上创建一系列以太网设备名称。我想要一个名称列表,以便以后可以迭代它们。

例如-假设我有两个以太网NIC-enp2s0和enp3s0和一个无线卡-wlp4s0

lscpi中我会看到

02:00.0 Ethernet controller: <truncated>
03:00.0 Ethernet controller: <truncated>
04:00.0 Network controller: Intel Corporation Wireless 

类似ip a显示

1: lo: <truncated>
2: enp2s0: <truncated>
3: enp3s0: <truncated>
4: wlp4s0: <truncated>

如何创建名称数组,以便可以迭代它们?
enp2s0 enp3s0

我已经弄清楚了如何使用查找第一个NIC

NIC=$(basename $(udevadm info -e | grep "DEVPATH=.*$(lspci | grep -m 1  Ethernet | cut -f 1 -d\ )/net" | cut -f 2 -d\ ))

但是我不知道如何循环这种方法。有什么建议可以在bash中实现吗?

谢谢

Densha

4 个答案:

答案 0 :(得分:2)

nmcli的输出可以轻松解析,但是您可能必须先安装它。

nmcli device的示例输出:

DEVICE  TYPE      STATE        CONNECTION       
eno1    ethernet  connected    wired connection 
wlp2s0  wifi      unavailable  --               
lo      loopback  unmanaged    --

要仅提取以太网设备的名称,请使用

nmcli device | awk '$2=="ethernet" {print $1}'

在此示例中,输出将为eno1。您可以像往常一样在循环中使用该命令:

for device in $(nmcli device | awk '$2=="ethernet" {print $1}'); do
    # stuff
done

答案 1 :(得分:0)

for f in $(ip a | grep enp | awk '{print $2}' | cut -d":" -f1)
do 
  <something with $f>
done

对于不是以“ enp”开头的设备,可以选择以下方法:

for f in $(ip a | grep -B1 "ether" | grep -v ether | awk '{print $2}' | cut -d":" -f1)
do 
  <something with $f>
done

答案 2 :(得分:0)

感谢我将原件修改为

的建议
for DEV in $(lspci | grep   Ethernet | cut -f 1 -d\ )
do
  NIC=$(basename $(udevadm info -e | grep "DEVPATH=.*$DEV/net" | cut -f 2 -d\ ))
  echo $NIC
done

感谢您的建议

答案 3 :(得分:0)

网络设备

最近的Linux发行版使用 iproute2 套件来管理网络。

列出设备的基本命令是ip link show,可以缩写为ip l

您可以:

ip l | sed 's/^ *[0-9]\+: \([^ ]\+\):.*/\1/p;d'

可能会返回:

lo
eth0

说明:

ip l的典型输出(可以写成:ip links show)如下:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether b8:27:eb:5f:b0:eb brd ff:ff:ff:ff:ff:ff

sed命令将

  • 替换(s///
  • 以0或更多空格(*)开头的行
  • 后跟数字,冒号和空格([0-9]\+:
  • 任何非空格(\([^ ]\+\))的格式
  • 其后是一个冒号和其余的行
  • 通过字符串与模式(/\1/)匹配
  • 然后打印结果行(p
  • 并丢弃其他所有;d

替代:

要对$iface进行循环操作,您可以编写:

shopt -s extglob
while IFS=$' :\t\r\n' read num iface line;do
    if [ "$num" ] && [ -z "${num//*([0-9])}" ] && [ "$iface" ] ;then
        echo Doing something with $iface
    fi
done < <(ip l)

...

Doing something with lo
Doing something with eth0

(IP地址)

此小循环将为每个接口的每个IPv4地址打印1行。 (未使用或未配置的界面将不会显示):

while IFS=$' :\t\r\n' read p1 p2 line ;do
    [ "$p1" ] && {
        [ -z "${p1//*([0-9])}" ] && [ "$p2" ] && crtif=$p2
        if [ -z "${p1/inet}" ] ;then
            echo Doing something with $crtif having ip $p2
        fi
     }
done < <(ip a)

Doing something with lo having ip 127.0.0.1/8
Doing something with eth0 having ip 192.168.1.35/24