LINUX.ORG.RU

Небольшой шелл-скриптик

 


0

1

Помогите разобраться чутка, есть функция проверки внешнего айпи адреса с эталоном(двумя эталонами ибо динамический адрес), если не соответствует эталону, отправляется сообщение «сеть отключена» и команда nmcli networking off, всё работает более менее, за исключением того, что по моей задумке nmcli networking off будучи уже исполненным, не должен быть вновь выключен, но как бы не происходило, всегда получается, что команда выключает сеть даже когда сеть уже выключена, а когда она выключена естественно проверка айпи адреса приводит к несоответствию с эталоном и т.д.

https://bpaste.net/show/b447db70d41e

Добавь в него set -x и посмотри.

И запуск nmcli general я бы написал так: nmcli general | tail -n+2 | cut -f1 -d' ' (но не думаю, что ошибка в этом).

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)

вообще, тебе книжки писать, а не скрипты

а у тебя в скрипте есть проверка «выключенного» состояния?

насколько понял, ты хочешь детектироврать три состояния:
1. «включено» куда-надо
2. «включено» куда-ненадо
3. «выключено»

где п.3 ?

anonymous
()
Ответ на: комментарий от anonymous

где п.3 ?

Если не включено и не включено, тогда вообще пофиг, пусть будет как есть. Лол.

mord0d ★★★★★
()
Ответ на: комментарий от anonymous
if [ "$nmcli" != 'connected' ]; then 
    echo "ALERT $nmcli"&&notify-send --urgency critical -t 2000  "Небезопаснo, сеть отключена"&&nmcli networking off; else
    echo "ALERT $nmcli"&&notify-send --urgency normal -t 2050  "Ожидается ручное переподключение";  
    fi

Вот же, проверка осуществляется через запись в переменную nmcli инфы о состоянии подключения, только эта функция не работает так, как я хочу.

cheetah111v
() автор топика
Ответ на: комментарий от cheetah111v

как вариант

Собственно из Вашего сообщения (мне) вообще не понятно, как оно должно работать. И скрипт «не прозрачный»...

Ладно, возможно я правильно догадался и это будет работать как Вам нужно

if [ "$nmcli" != 'connected' ]; then 
    echo "ALERT $nmcli"
    notify-send --urgency critical -t 2000  "Небезопаснo, сеть отключена"
    if [ "$(nmcli networking)" == "enabled" ]
    then nmcli networking off
    fi; else
    echo "ALERT $nmcli"
    notify-send --urgency normal -t 2050  "Ожидается ручное переподключение";  
fi

anymouze ★★
()
Ответ на: как вариант от anymouze

https://bpaste.net/show/be5c2a57a3bf

написал через case, один фиг не работает!

А хочу я, чтобы при несоответствии айпишника эталону, вырубалась сеть, но уже будучи вырубленной не вырубалась вновь, а лишь писала сообщение «ожидается ручное покдлючение».

cheetah111v
() автор топика
Ответ на: комментарий от anymouze

Не сработало! Оно не выполняет отключение сети, оно при несоответствии с эталоном сразу переходит к

else
    echo "ALERT $nmcli"
    notify-send --urgency normal -t 2050  "Ожидается ручное переподключение";  

Хотя и в Вашем варианте и в моем должна быть сначала проверка на подключение в переменной и в зависимости от того срабатывать.

cheetah111v
() автор топика
Ответ на: комментарий от cheetah111v

ё-мое!

при несоответствии айпишника эталону, вырубалась сеть, но уже будучи вырубленной не вырубалась вновь, а лишь писала сообщение «ожидается ручное покдлючение».

Сразу бы так!

#!/bin/bash
while true; do 
 ip2=$(curl --connect-timeout 7 -s https://api.ipify.org | cut -c 1-3)
 echo "$ip2" > /tmp/myip
 sleep 20;
 nmcli=$(nmcli general | grep connected | cut -c 1-11)
 date=$(date +%T)
#ip=$(cat /tmp/myip)
 (if   [ "$ip2" = '121' ]; then
       echo "OK $date";
  elif [ "$ip2" = '155' ]; then 
       echo "OK $date"; else
#ip не соответствует!
    if [ "$(nmcli networking)" == "enabled" ]
    then nmcli networking off
    fi
   if [ "$nmcli" != 'connected' ]; then 
     echo "ALERT $nmcli"
     notify-send --urgency critical -t 2000  "Небезопаснo, сеть отключена"
;  else
     echo "ALERT $nmcli"
     notify-send --urgency normal -t 2050  "Ожидается ручное переподключение";  
   fi
#exit 1; 
  fi; sleep 1); done 

anymouze ★★
()
Ответ на: ё-мое! от anymouze

Вопрос, ты сам проверяешь это прежде чем отослать? В моем случае эффект 1 в 1 со всеми предыдущими версиями кода, уже при выключенном networking, все равно продолжает выключать его!

cheetah111v
() автор топика
Ответ на: комментарий от cheetah111v

да я, там по мелочи напортачил

;  else

но похоже дело не в этом... дело в том, что команда

nmcli networking off
«вырубает» сеть полностью, не подключение, а всю сеть — дальше она в скрипте нигде и никогда не включается

anymouze ★★
()
Ответ на: комментарий от cheetah111v

а если так:

#!/bin/bash
while true; do 
  ip2=$(curl --connect-timeout 7 -s https://api.ipify.org | cut -c 1-3) ; echo "$ip2" > /tmp/myip; sleep 20;
  nmcli=$(nmcli general | tail -n+2 | cut -f1 -d' ')
  date=$(date +%T)
  case "$ip2" in
    155.*) echo "OK $date" "$nmcli"
          ;;
    121.*) echo "OK $date" "$nmcli"
          ;;
       *) case "$nmcli" in
            connected) 
                       echo "ALERT $nmcli"
                       notify-send --urgency critical -t 2000  "Небезопаснo, сеть отключена"
                       nmcli networking off
                       ;;
                    *) 
                       echo "ALERT2 $nmcli"
                       notify-send --urgency normal -t 2050  "Ожидается ручное переподключение"
                       ;;
          esac
          ;;
  esac
  sleep 1
done
anonymous
()
Ответ на: комментарий от anymouze

в переменную nmcli=$(nmcli general | grep connected | cut -c 1-11)

пишется либо connected, либо пусто, всё что я хочу, чтобы при значении connected подавалась команда nmcli networking off(после этой команды уже будет пустая переменная) и далее лишь выскакивает сообщение о том что надо вручную подключить сеть и всё. Неужели это так сложно?

cheetah111v
() автор топика
Ответ на: комментарий от anonymous

Какой смысл этого скрипта если не приводится сравнение с эталоном? Ты входную для функции кейса делаешь тупо из внешнего айпишника, тогда как мне надо чтобы этот внешний айпишник сравнивался с двумя эталонами и при несовпадении срабатывало отключение nmcli.

cheetah111v
() автор топика
Ответ на: комментарий от cheetah111v

так посмотрите вариант от anonymous — я код не запускал, но он кажется первый кто разобрался...

В «исходном» коде условие проверки неверно задано

if [ "$nmcli" != 'connected' ]; then 
# выполняется только когда nmcli == ""
    echo "ALERT $nmcli"
    notify-send --urgency critical -t 2000  "Небезопаснo, сеть отключена"
    nmcli networking off # сети уже нет, а "мы" её выключаем и выключаем
else
# будет выполняться при nmcli == "connected"
    echo "ALERT $nmcli"
    notify-send --urgency normal -t 2050  "Ожидается ручное переподключение";  
    fi
Так правильно (но я минут на 20 позже к этому пришел, чем anonymous и не стал публиковать)
if [ "$nmcli" == 'connected' ]; then 
# будет выполняться при nmcli == "connected"
    echo "ALERT $nmcli"
    notify-send --urgency critical -t 2000  "Небезопаснo, сеть отключена"
    nmcli networking off # отключаем сеть
 else
# выполняется только когда nmcli == ""
    echo "ALERT $nmcli"
    notify-send --urgency normal -t 2050  "Ожидается ручное переподключение";  
    fi

anymouze ★★
()
Ответ на: комментарий от anymouze

полный вариант

#!/bin/bash
while true; do 
 ip2=$(curl --connect-timeout 7 -s https://api.ipify.org | cut -c 1-3)
 sleep 20;
 nmcli=$(nmcli general | grep connected | cut -c 1-11)
 date=$(date +%T)
 (if   [ "$ip2" = '121' ]; then
       echo "OK $date";
  elif [ "$ip2" = '155' ]; then 
       echo "OK $date"; else
# ip не соответствует шаблонам
  if [ "$nmcli" == 'connected' ]; then 
# будет выполняться при nmcli == "connected"
    echo "ALERT $nmcli"
    notify-send --urgency critical -t 2000  "Небезопаснo, сеть отключаем"
    nmcli networking off # отключаем сеть
 else
# выполняется только когда nmcli == ""
    echo "ALERT $nmcli"
    notify-send --urgency normal -t 2050  "Ожидается ручное переподключение";  
    fi
  fi; sleep 1); done
anymouze ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.