Толик Панков
hex_laden
............ .................. ................
November 2020
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Проверка состояния сетевого устройства (например, eth0) в Linux

Преамбула


Бывает необходимо проверить состояние (статус) того или иного сетевого устройства, например, сетевой карты. Вообще вариантов может быть три:
1. Устройство работает (up)
2. Устройство есть, но не работает в данный момент (down)
3. Устройства нет вообще.

Описание принципа действия


Чтобы определить состояние сетевого устройства, нужно проанализировать вывод команды ifconfig. Если устройство вообще есть, то оно будет в выводе ifconfig -a (ключ -a - все устройства). Если устройство есть, но в данный момент не работает, в выводе ifconfig -a оно будет, в выводе ifconfig - нет.

Например, устройство veth1 в данный момент не работает, вывод ifconfig:

chaosadm@chaos:~# ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


Вывод ifconfig -a для сравнения:

chaosadm@chaos:~# ifconfig -a
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

veth1: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        inet 10.10.0.119  netmask 255.255.0.0  broadcast 10.10.0.255
        ether 62:4e:2c:ad:06:fa  txqueuelen 1000  (Ethernet)
        RX packets 1034  bytes 93233 (91.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 136  bytes 12047 (11.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Значит достаточно отфильтровать вывод ifconfig и ifconfig -a grep'ом по имени конкретного сетевого устройства, и заставить grep посчитать количество строк (ключ -c):

ifconfig -a | grep eth0 -c

eth0 - имя устройства.

Если количество строк будет 0 - устройства совсем нет.

ifconfig | grep $DEV -c

Если количество строк будет больше 0 - устройство работает (up), если предыдущая команда выдала 1, а эта команда нет, то устройство есть, но не работает (down). Если используются псевдонимы, то надо использовать полные имена (например, eth0:1).

Скрипт


Все это дело можно автоматизировать скриптом.
Продумаем коды возврата: 0 - сетевое устройство работает (up), 1 - устройство не работает (down), 2 - устройство не найдено (none), 3 - неправильные параметры скрипта или запрос справки.
Добавим в скрипт дополнительный параметр -s - если он указан, скрипт не будет выводить сообщений на консоль, а только сигнализировать о статусе сетевого устройства кодом возврата (для использования в других скриптах).

1. Проверяем правильность параметров, выводим помощь:

#!/bin/bash

#check network device status
#exit codes 0 - device up 1 - device down 2 - none device 
#3 - help or wrong parameters

SLNT=0

print_help()
{
    echo "Use "`basename $0`"  [-s]"
    echo " - network device name, e.g. eth0"
    echo "-s - silent mode, no console output"
}

#parameters check and set silent mode
if [ $# -eq 0 ]; then
    echo "Wrong parameters!"
    echo
    print_help
    exit 3
else
    if [ $# -eq 2 ]; then
	if [[ "$2" == "-s" ]]; then
	    SLNT=1
	else
	    echo "Wrong parameters!"
	    echo
	    print_help
	    exit 3
	fi
    fi
fi

#print help
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
    print_help
    exit 3
fi


2. Проверяем наличие устройства вообще:

DEV=$1

# check device exist
DOWN=`ifconfig -a | grep $DEV -c`
if [ $DOWN -eq 0 ]; then
    if [ $SLNT -eq 0 ];then
	echo "Device $DEV: NONE"
    fi
    exit 2
fi


3. Проверяем, работает оно или нет:

#check up/down status
UP=`ifconfig | grep $DEV -c`
if [ $UP -eq 0 ]; then #device down
    if [ $SLNT -eq 0 ];then
	echo "Device $DEV: DOWN"
    fi
    exit 1
else
    if [ $SLNT -eq 0 ];then
	echo "Device $DEV: UP"
    fi
    exit 0
fi


Скрипт целиком


На PasteBin
На GitHub
Пример использования в другом скрипте, который организует Network Namespace'ы

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/03/09/proverka-sostoyaniya-setevogo-ustrojstva-naprimer-eth0-v-linux/

From:
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message:



Notice! This user has turned on the option that logs IP addresses of anonymous posters.