Бывает необходимо проверить состояние (статус) того или иного сетевого устройства, например, сетевой карты. Вообще вариантов может быть три:
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’ы