[РЕШЕНО] Автоматизация смены точек доступа wi-fi, скрипт?

Kycok
для опции scan требуется root я же вроде написал...

wau
требуется еще и подключиться, не конфликтуя с нетворкманагером гнома. Кроме того, scan довольно энергозатратен, разумнее не скан делать, а контролировать текущий уровень сигнала текущего подключения и если он просел ниже заданного предела, тогда да, скан.
я что то всё равно не вижу проблемы))
Ошибки в тексте-неповторимый стиль автора©
с использованием netctl получается как то так, без него получится чутка-чутка длинее...

#!/bin/bash
INTERFACE="wlp3s0"
ESSID1=""
ESSID2=""
MIN_QUALITY=""

WLAN_CHECK ()
{
QUAL=`iwconfig $INTERFACE | grep Qual | awk '{print $2}' | sed "s/.*=//" | cut -c-2`
ESSID=`iwconfig $INTERFACE | grep ESSID | cut -c 34- | rev | cut -c 4- | rev`
if [[ "$QUAL" < $MIN_QUALITY ]]; then
	if  [[ "$ESSID" == $ESSID1 ]]; then
		echo "$ESSID2"
	else
		echo "$ESSID1"
	fi
fi
}

WLAN_Q ()
{
SCAN_E=(`iwlist $INTERFACE scan | grep "ESSID" | cut -c 28-| rev | cut -c 2- | rev`)
SCAN_Q=(`iwlist $INTERFACE scan | grep "Quality" |  awk '{print $1}' | cut -c 9-10`)
for ((a=0; a <= (`echo ${SCAN_E[*]} | wc -w`); a++))
do
	if [[ "`echo ${SCAN_E[$a]}`" == $1 ]]; then
        	echo ${SCAN_Q[$a]}
	fi
done
}

WLANCHECK=`WLAN_CHECK`
if [ -z `WLAN_CHECK` ]; then
		exit 0
	else
	WLANCHECK2=`WLAN_Q $WLANCHECK`
	if [[ "$WLANCHECK2" > $MIN_QUALITY ]]; then
		netctl stop-all && sleep 5 && netctl start wlan-"$WLANCHECK"
	fi
fi
Ошибки в тексте-неповторимый стиль автора©
Спасибо, внешне вполне даже вроде рабочее решение, пробовать буду на выходных.
ind.indeviral
для опции scan требуется root я же вроде написал...
Точно, извини. Тогда я вижу все это так:
#!/bin/bash

#---Данные, вводимые пользователем------------------------------------------------------------------------------
INTERFACE=wlp4s0        # Имя работающего интерфейса
BAD_QUAL=30             # Минимально допустимый уровень текущего сигнала (Х1)
WTS=30                  # Максимально допустимая разница в сигналах (Х3)
ESSID_1=ИМЯ1            # Имя первого интерфейса
ESSID_2=ИМЯ2            # Имя второго интерфейса
#---Программа---------------------------------------------------------------------------------------------------
NOW_QUAL=$(iwconfig ${INTERFACE} | grep Link | cut -c24-25)
if [ ${NOW_QUAL} -lt ${BAD_QUAL} ]
  then
    NOW_ESSID=$(iwconfig wlp4s0 | grep ESSID | cut -c34-| rev | cut -c 4- | rev)
    [[ ${NOW_ESSID} == ${ESSID_1} ]] && ESSID_1=${ESSID_2}
    SCAN_ESSID=(`iwlist wlp4s0 scan | grep ESSID | cut -c 28-| rev | cut -c 2- | rev`)
    SCAN_QUAL=(`iwlist wlp4s0 scan | grep Quality | awk '{print $1}' | cut -c 9- | rev | cut -c 4- | rev`)
    for a in $(seq 0 `echo ${SCAN_ESSID[*]} | wc -w`)
      do
        [[ `echo ${SCAN_ESSID[$a]}` == ${NOW_ESSID} ]] && NOW_QUAL=${SCAN_QUAL[$a]}
        [[ `echo ${SCAN_ESSID[$a]}` == ${ESSID_1} ]] && QUAL_1=${SCAN_QUAL[$a]}
      done
    if [ ${NOW_QUAL} -lt ${QUAL_1} ]
      then
        RAZN=$[${QUAL_1}-${NOW_QUAL}]
      else
        RAZN=$[${NOW_QUAL}-${QUAL_1}]
    fi
    [ ${RAZN} -lt ${WTS} ] && КОМАНДА_ПЕРЕКЛЮЧЕНИЯ
fi
Команду переключения для networkmanager'a надо найти, я знаю только то, как это делать в netctl
GitHub, ArchWiki, AUR
https://wiki.archlinux.org/index.php/NetworkManager#Command_line
Kycok
Тогда я вижу все это так:

Спасибо, тем не менее в скрипте есть небольшие ошибки, типа iwlist wlp4s0 вместо iwlist ${INTERFACE} , еще видимо какие-то неточности в операциях определения и сравнения качества сигнала, во всяком случае срабатывает не всегда, вот два подряд запуска скрипта, между запусками содержание не меняется -

./wifi: line 22: [: 31: ожидается использование унарного оператора
./wifi: line 26: 31-: ошибка синтаксиса: ожидается операнд (error token is "-")
 ./wifi
#
- на два запуска переключение не состоялось.

Итоговый вид такой -


#!/bin/bash

#---Данные, вводимые пользователем------------------------------------------------------------------------------
INTERFACE=wlp3s0        # Имя работающего интерфейса
BAD_QUAL=44             # Минимально допустимый уровень текущего сигнала (Х1)
WTS=10                  # Максимально допустимая разница в сигналах (Х3)
ESSID_1=VSQR            # Имя первого интерфейса
ESSID_2=VSQR2            # Имя второго интерфейса
#---Программа---------------------------------------------------------------------------------------------------
NOW_QUAL=$(iwconfig ${INTERFACE} | grep Link | cut -c24-25)
if [ ${NOW_QUAL} -lt ${BAD_QUAL} ]
  then
    NOW_ESSID=$(iwconfig ${INTERFACE} | grep ESSID | cut -c34-| rev | cut -c 4- | rev)
    [[ ${NOW_ESSID} == ${ESSID_1} ]] && ESSID_1=${ESSID_2}
    SCAN_ESSID=(`iwlist ${INTERFACE} scan | grep ESSID | cut -c 28-| rev | cut -c 2- | rev`)
    SCAN_QUAL=(`iwlist ${INTERFACE} scan | grep Quality | awk '{print $1}' | cut -c 9- | rev | cut -c 4- | rev`)
    for a in $(seq 0 `echo ${SCAN_ESSID[*]} | wc -w`)
      do
        [[ `echo ${SCAN_ESSID[$a]}` == ${NOW_ESSID} ]] && NOW_QUAL=${SCAN_QUAL[$a]}
        [[ `echo ${SCAN_ESSID[$a]}` == ${ESSID_1} ]] && QUAL_1=${SCAN_QUAL[$a]}
      done
    if [ ${NOW_QUAL} -lt ${QUAL_1} ]
      then
        RAZN=$[${QUAL_1}-${NOW_QUAL}]
      else
        RAZN=$[${NOW_QUAL}-${QUAL_1}]
    fi
    [ ${RAZN} -lt ${WTS} ] && nmcli dev wifi connect ${ESSID_1} password пароль_точки_доступа
 

ind.indeviral
с использованием netctl получается как то так, без него получится чутка-чутка длинее...

Спасибо, скрипт пошел сразу и без сучков.


#!/bin/bash
INTERFACE="wlp3s0"
ESSID1="VSQR"
ESSID2="VSQR2"
MIN_QUALITY="44"

WLAN_CHECK ()
{
QUAL=`iwconfig $INTERFACE | grep Qual | awk '{print $2}' | sed "s/.*=//" | cut -c-2`
ESSID=`iwconfig $INTERFACE | grep ESSID | cut -c 34- | rev | cut -c 4- | rev`
if [[ "$QUAL" < $MIN_QUALITY ]]; then
	if  [[ "$ESSID" == $ESSID1 ]]; then
		echo "$ESSID2"
	else
		echo "$ESSID1"
	fi
fi
}

WLAN_Q ()
{
SCAN_E=(`iwlist $INTERFACE scan | grep "ESSID" | cut -c 28-| rev | cut -c 2- | rev`)
SCAN_Q=(`iwlist $INTERFACE scan | grep "Quality" |  awk '{print $1}' | cut -c 9-10`)
for ((a=0; a <= (`echo ${SCAN_E[*]} | wc -w`); a++))
do
	if [[ "`echo ${SCAN_E[$a]}`" == $1 ]]; then
        	echo ${SCAN_Q[$a]}
	fi
done
}

WLANCHECK=`WLAN_CHECK`
if [ -z `WLAN_CHECK` ]; then
		exit 0
	else
	WLANCHECK2=`WLAN_Q $WLANCHECK`
	if [[ "$WLANCHECK2" > $MIN_QUALITY ]]; then
		nmcli dev wifi connect "$WLANCHECK" password пароль_точки_доступа
	fi
fi

Теперь пойду посплю и буду дорабатывать - операция сканирования вцелом лишняя, ведь заведомо известно, что если есть подключение к одной точке, то вторая рядом. И, кроме того, если ни одна из них не подключена, то нечего и искать\сканировать (ведь не только к ним подключаемся). Просто в лоб - если качество плохое, то сразу и переключаемся.
В результате спасибо, большое спасибо всем участникам за подсказки.

Итоговая версия исправно работающего скрипта (апдейт от 2015-10-07 в связи с использованием netctl-auto switch-to, строки команд для гномова нетворкманагера и просто netctl сохранены) -

#

!/bin/bash
#допущения и соглашения - скрипт балансировки переключения между
# двумя точками доступа, расположенными
#рядом и с частично перекрывающимися зонами действия. Принято
#допущение, что если в текущий момент времени нет
#подключения к одной из этих точек доступа,
#то и нет смысла искать вторую, что если у одной сигнла плох, то у другой хорош
# (для экономии времени и батарейки на сканировании сетей). Имя обоих точек однотипно,
#первые 4 символа одинаковы (можно поднастроить ниже)
INTERFACE="wlp3s0"               #имя вай-фай интерфейса
ESSID1="VSQR"                       #имя первой точки доступа
ESSID2="VSQR2"                      #имя второй точки доступа
MIN_QUALITY="44"                   #минимально допустимое качество, при котором происходит переключение
while [ 1 ]; do

NOW=`iwconfig $INTERFACE | grep ESSID | cut -c 34-37` #можно поднастроить длину одинаковой части имен точек доступа,
# заменив 37 на нужную позицию в строке (34-37 - это 4 символа)

#определяем, что мы в нужной зоне по факту имеющегося подключения
#к одной из целевых точек -
 if [[ $NOW = $ESSID1 ]]; then

#вычисляем ее имя и качество
   QUAL=`iwconfig $INTERFACE | grep Qual | awk '{print $2}' | sed "s/.*=//" | cut -c-2`
   ESSID=`iwconfig $INTERFACE | grep ESSID | cut -c34-| rev | cut -c 4- | rev`

#если качество хуже заданного, переключаемся на другую точку -
   if [[ "$QUAL" < $MIN_QUALITY ]]; then
	if  [[ "$ESSID" = $ESSID1 ]]; then
		#netctl stop-all && sleep 1 && netctl start
		netctl-auto switch-to "$ESSID2"

	else
#		netctl stop-all && sleep 1 && netctl start
		netctl-auto switch-to "$ESSID1"

        fi
   fi
 fi

в этом скрипте единственное, что требует рутовых прав, это iwconfig $INTERFACE . Но ведь и без рутовых прав что нетворкманагер, что wicd способны показать уровень сигнала. Как еще можно считать уровень сигнала?
вся фишка была в том чтобы проверить какой сигнал у другой точки, а потом только подключатся... но эт ваше дело
а networkmanager частично обходит root через polkit поэтому и работает. Сигнал можно проверить через iwlist если запустить без root он не будет ничего сканировать.
Ошибки в тексте-неповторимый стиль автора©
wau
Спасибо, тем не менее в скрипте есть небольшие ошибки, типа iwlist wlp4s0 вместо iwlist ${INTERFACE} , еще видимо какие-то неточности в операциях определения и сравнения качества сигнала, во всяком случае срабатывает не всегда, вот два подряд запуска скрипта, между запусками содержание не меняется
Не было возможности заниматься отладкой, потому что у меня только одна точка доступа. Это ведь не главное, главное - идеи :)
wau
в этом скрипте единственное, что требует рутовых прав, это iwconfig $INTERFACE . Но ведь и без рутовых прав что нетворкманагер, что wicd способны показать уровень сигнала. Как еще можно считать уровень сигнала?
Странно, у меня iwconfig все отображает и без рута
GitHub, ArchWiki, AUR
 
Зарегистрироваться или войдите чтобы оставить сообщение.