Бывает необходимо проверить состояние (статус) того или иного сетевого устройства, например, сетевой карты. Вообще вариантов может быть три:
1. Устройство работает (up)
2. Устройство есть, но не работает в данный момент (down)
3. Устройства нет вообще.
Чтобы определить состояние сетевого устройства, нужно проанализировать вывод команды ifconfig
. Если устройство вообще есть, то оно будет в выводе ifconfig -a
(ключ -a
— все устройства). Если устройство есть, но в данный момент не работает, в выводе ifconfig -a
оно будет, в выводе ifconfig
— нет.
Например, устройство veth1
в данный момент не работает, вывод ifconfig
:
chaosadm@chaos:~# ifconfig lo: flags=73mtu 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=73mtu 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 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’ы