Как динамически находить имя и тип интерфейсов, подключенных к системе

У меня есть случай использования, когда мне нужно динамически настроить некоторые файлы, которые включают имена интерфейсов, присутствующих в системе, например eth0 , wlan0 . Однако, когда я меняю систему, иногда ее меняют на eth1 или wlan1 . Начиная с Ubuntu 14.04 интерфейсы Ethernet называются p2p1 , p1p1 как это и беспроводные интерфейсы как wlan0 или wlan1 .

Таким образом, мы можем сказать, что имя интерфейса может быть любым, неважно, если мы можем найти, какие имена присвоены какому типу интерфейса.

Я написал для этого небольшой сценарий, но я не знаю, есть ли лучший способ найти его, который работает во всех системах на базе Linux.

#!/bin/bash

# check if directory exist 
DIRECTORY=/sys/class/net
wifi_interface=""
lan_interface=""
if [ -d "$DIRECTORY" ]; then
    cd $DIRECTORY

    ilist=`ifconfig -s  | awk '{print $1}' | tail -n +2`

    # array length
    ilist_len=`echo "${ilist[@]}" | wc -l`

    # empty array 
    il=

    # Iterating over interfaces 
    for i in $(seq 1 $ilist_len)
    do 
        iname=`echo $ilist | sed -n "$i"p`
        echo $iname
        if [ "$iname" != "lo" ]; then
            cur_dir=$DIRECTORY/$iname
            cd $cur_dir
            if [ -d "$cur_dir/wireless" ]; then
                wifi_interface=$iname
            else 
                lan_interface=$iname
            fi
        fi
        pwd
        cd ~
    done
    exit 0
else
    echo "Can't find the directories ! Something went wrong "
    exit 0
fi

В приведенном выше сценарии я выбрал тип интерфейса на основе наличие или отсутствие каталога / sys / class / net / / wireless . Сценарий предполагает, что для Ethernet и беспроводной сети присутствует только интерфейс 1-1.

Я сомневаюсь, что каталог wireless всегда присутствует во всех беспроводных интерфейсах. Например, в случае виртуальных беспроводных интерфейсов.

4
задан 14 January 2016 в 08:27
1 ответ

Сегодня для относительно современного дистрибутива Linux я бы сначала попробовал использовать команду ip

ip link show

, а затем отфильтруйте его вывод, чтобы получить список интерфейсов.

Вы также можете использовать ifconfig -a , но более новые выпуски некоторых дистрибутивов больше не устанавливают его по умолчанию.

Аналогично nets tat -i может оказаться полезным.

Вы можете использовать команду iwconfig , чтобы определить, является ли интерфейс беспроводным или нет

iwconfig ens160
ens160    no wireless extensions.
5
ответ дан 3 December 2019 в 03:16

Теги

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