Начало
Всё началось с покупки одноплатного компьютера. На нём я поднял облачный сервис Seafile, медиа-сервер Jellyfin и вики-движок Wiki.js. Потребляет такой компьютер с подключенным внешним жёстким диском крайне мало. Всё это добро я использую в одном лице для личных нужд. Поэтому платить за белый IP адрес и уж тем более покупать доменное имя считаю лишним. Вот только провайдер постоянно меняет мне внешний IP, а доступ хотелось бы всегда иметь и за пределами домашней сети.
Идея
Создать задание Cron, которое периодически будет запускать сценарий, проверяющий, не поменялся ли IP на роутере. В случае изменения отправить его в письме на Yandex Почту.
Роутер
Zyxel Keenetic Viva
Реализация
Нам понадобится куда-то сохранять старый и новый IP. Я создал 2 текстовых файла: old_ip.txt и new_ip.txt.
Далее для работы скрипта требуется установить telnet:
sudo apt update sudo apt install telnet
Создадим следующий shell сценарий telnet.sh:
#!/bin/sh HOST='192.168.1.1' USER='Your user' PASSWD='Your password' CMD='show interface PPPoE0' ( echo open "$HOST" sleep 2 echo "$USER" sleep 2 echo "$PASSWD" sleep 2 echo "$CMD" sleep 2 echo "exit" ) | telnet | grep -oP 'address: \K.*' >> ./new_ip.txt
HOST - адрес роутера. USER и PASSWD - это логин и пароль администратора роутера. В CMD вместо PPPoE0 следует вписать название вашего настроенного интерфейса. У меня это PPPoE0. Сценарий получает текущий внешний IP роутера и сохраняет его в файл new_ip.txt.

Дальнейшую логику я реализовал на Python. Создадим следующий сценарий script.py:
#!/usr/bin/python import subprocess import smtplib def CheckFile(): file = open('old_ip.txt', 'r') if ip != file.readline().strip(): file.close() open('old_ip.txt', 'w').close() file = open('old_ip.txt', 'w') file.write(ip) file.close() return True return False def SendMail(): content = ip mail = smtplib.SMTP('smtp.yandex.ru', 587) mail.ehlo() mail.starttls() mail.login('Your Yandex mail login', 'Your Yandex mail password') mail.sendmail('Your Yandex mail login', 'Your Yandex mail login', content) def GetIp(): open('new_ip.txt', 'w').close() subprocess.Popen('./telnet.sh').wait() GetIp() ip = open('new_ip.txt', 'r').readline().strip() if CheckFile() == True: SendMail()
В функции SendMail указываем ваш логин и пароль от Yandex Почты. Т.е. мы проходим авторизацию в своём ящике и отправляем письмо сами себе.
Теперь в настройках Yandex Почты разрешим способ авторизации через портальный пароль. Это требуется для беспрепятственной авторизации.

Так же незабываем дать права на запуск нашим скриптам!
Я создал задание Cron, которое запускает скрипт каждые полчаса:
*/30 * * * * python3 script.py
Надеюсь, статья оказалась полезной. Спасибо за внимание.
