Начало
Всё началось с покупки одноплатного компьютера. На нём я поднял облачный сервис 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
Надеюсь, статья оказалась полезной. Спасибо за внимание.