Linux bash скрипт для проверки интернет соединения не работает - PullRequest
0 голосов
/ 27 марта 2019

Я хочу использовать bash-скрипт на своем Raspberry Pi, чтобы проверить, все еще ли соединение с интернетом.

Я нашел этот скрипт, который расширил:

#!/bin/bash

# I do not work properly
if [[ "$(ping -c 1 8.8.8.8 | grep 'Network is unreachable' )" != "" ]]; then
    echo "Network isn't present"
    sudo shutdown -r 0
    exit 1
fi

# I work properly
if [[ "$(ping -c 1 8.8.8.8 | grep '100% packet loss' )" != "" ]]; then
    echo "Internet isn't present"
    sudo shutdown -r 0
    exit 1
else
    echo "Internet is present"
    exit 0
fi

Вторая часть работает хорошо, а первая - нет.

Я отключил Ethernet-кабель и получил сообщение об ошибке типа connect: Network is unreachable. Так, как и ожидалось. Но я не понимаю, почему мой сценарий не поднимает его? Я думаю, что это как-то связано с сообщением об ошибке, а не с выводом. Но я не знаю, как мне пришлось бы настроить свой сценарий так, чтобы он также выводил сообщения об ошибках, предполагая, что это правильно.

Я нашел способ, как получить вывод для регистрации grep с помощью этой строки ping -c 1 8.8.8.8 2> >(grep 'unreachable';). Тем не менее, это все равно делает мой скрипт неудачным, потому что он больше не распознается остальной частью этой строки И я также не совсем понимаю, что делает 2> >().

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Здесь вам не нужно сравнение строк:

Команда

ping дает соответствующий код возврата после завершения выполнения.

Итак, вы можете использовать что-то вроде:

 function check_connectivity() {

    local test_ip
    local test_count

    test_ip="8.8.8.8"
    test_count=1

    if ping -c ${test_count} ${test_ip} > /dev/null; then
       echo "Have internet connectivity"
    else
       echo "Do not have connectivity"
    fi
 }

 check_connectivity
1 голос
/ 27 марта 2019

Попробуйте это:

x=`ping -c1 google.com 2>&1 | grep failure`
if [ ! "$x" = "" ]; then
echo "Network isn't present"
sudo shutdown -r 0
exit 1
fi

Или для вашего сценария я бы сделал:

if [[ "$(ping -c 1 8.8.8.8 | grep '100% packet loss' )" != "" ]]; then
  echo "Internet isn't present"
  sudo shutdown -r 0
  exit 1
elif [[ "$(ping -c 1 8.8.8.8 | grep 'packet loss' | grep -o "1[0-9][0-9]\+%")" != "" ]]; then
  echo "Network isn't present"
  sudo shutdown -r 0
  exit 1
else
  echo "Internet is present"
  exit 0
fi

Но я рекомендую использовать / sys / class / net вместо

# Test for network conection
for interface in $(ls /sys/class/net/ | grep -v lo);do
if [[ $(cat /sys/class/net/$interface/carrier) = 1 ]]; then OnLine=1;fi;done
if ! [ $OnLine ]; then echo "Internet isn't present" > /dev/stderr;sudo shutdown -r 0; exit; fi
...