Встала жесткая необходимость автоматической перезагрузки роутера при падении инета.
Все бы ничего... Но по ssh подключения проходят только с запросом пароля (ключи добавить на роутер не выходит - там работает busybox-кастрат).
Соответственно, для авто-ввода пароля из скрипта используется expect. В итоге, имеем скрипт:
#!/bin/bash
host1=yandex.ru
host2=mail.ru
#при непрохождении пинга запускается expect
((ping -w5 -c3 $host1 || ping -w5 -c3 $host2) > /dev/null 2>&1) ||
/usr/bin/expect -c 'expect "\n" { eval spawn /usr/bin/ssh -oStrictHostKeyChecking=no -oCheckHostIP=no admin@192.168.1.1; interact; set prompt ":|#|\\\$"; interact -o -nobuffer -re $prompt return
send "mypassword\r"; set prompt ">"; interact -o -nobuffer -re $prompt return; send "reboot\r"; interact }'
Запускается скрипт по крону. (Запускается, проверено в логах). Но expect не срабатывает. Кстати, не срабатывает и без крона, при запуске из командной строки.
Удается запустить скрипт ТОЛЬКО по следующей схеме:
создается два скрипта
#!/bin/bash (ОБРАТИТЕ ВНИМАНИЕ НА ЭТУ СТРОКУ)
host1=mail.ru
host2=yandex.ru
((ping -w5 -c3 $host1 || ping -w5 -c3 $host2) > /dev/null 2>&1) || ./chknet1.sh
и второй chknet1.sh
#!/usr/bin/expect (ОБРАТИТЕ ВНИМАНИЕ НА ЭТУ СТРОКУ)
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no admin@192.168.1.1
#use correct prompt
set prompt ":|#|\\\$"
interact -o -nobuffer -re $prompt return
send "mypassword\r"
set prompt ">"
interact -o -nobuffer -re $prompt return
send "reboot\r"
interact
И то срабатывает НЕ ПО КРОНУ, а при запуске вручную и только из папки /tmp. Очень хочется именно в bash делать одним скриптом...
Подскажите, что не так?