Проверка состояния сетевого устройства (например, 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/prov