棒子折腾记(二)- Linux IP变化邮件提醒

效果

m03j74fa.png

一、前言

最近折腾了下 内网穿透 ,,可能是家里的设备不太支持吧(可能是运营商禁用了);反正就是穿透不出去(但是连接到内网之后再访问就又可以了,估计是运营商设备把外网给禁了)
正好发现设备支持 IPv6 ,就试了下IPv6地址,发现居然不用穿透就能在公网直接访问 ,于是用 IPv6 来连接家里的debain(做 vpn ),再把局域网里的一些设备做“ 内网穿透”,就可以实现用公网访问家里内部的其他设备

二、步骤

本文 实验环境debain 系统,其他Linux系统实现也几乎一致!
(SSH连接上系统等基础步骤不再细说)

1、python环境准备

# 安装python环境(debain内置了python2和python3)
sudo apt install python3

# 用apt-get更新和-y确认同意所有要安装的项目
sudo apt-get update
sudo apt-get -y upgrade

# 重启
reboot

m027plav.png

# 安装依赖包
sudo apt install wget software-properties-common build-essential libnss3-dev zlib1g-dev libgdbm-dev libncurses5-dev   libssl-dev libffi-dev libreadline-dev libsqlite3-dev libbz2-dev

# 按y键开始安装:

# 下载最新版本python
wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz

# 解压提取文件
tar xvf Python-3.9.16.tgz

#更改工作目录
cd Python-*/

# 编译Python源码
./configure --enable-optimizations

# 构建Python3.9.16
sudo make altinstall

# 查询当前系统已安装的python的版本
python3 -V

m02eanl3.png

2、创建目录及相关文件

# 创建文件夹python
mkdir /python
# 创建相关文件
touch /python/AutoMail.py
touch /python/ip.log

m02ebnc7.png

3、编辑AutoMail.py

import json
from urllib.request import urlopen
import os
import time
import smtplib
from email.header import Header
from email.mime.text import MIMEText
# 两个获取ip地址的网站
ip_url_1 = 'https://api.ipify.org/?format=json'
ip_url_2 = 'http://jsonip.com'
# 配置文件名
config_file_name = '.global_ip.json'
# 第三方 SMTP 服务
mail_host = "smtp.qq.com"      # SMTP服务器
mail_user = "邮箱账号"      # 用户名
mail_pass = "授权码"               # 授权密码,非登录密码
sender = '邮箱账号'            # 发件人邮箱(最好写全, 不然会失败)
receivers = ['邮箱']      # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
title = 'Fan-Debain IP变更提醒:'              # 邮件主题
content = ''                    # 邮件内容
# 检查配置文件及其权限
def check_configfile_exist():
    file_exist = os.access(config_file_name, os.F_OK)
    file_read  = os.access(config_file_name, os.R_OK)
    file_write = os.access(config_file_name, os.W_OK)
    return{'file_exist':file_exist,'file_read':file_read,'file_write':file_write}
def generate_configfile(ip_addr):
    config_construct = {
        "ip_addr": ip_addr
    }
    with open(config_file_name, "w", encoding='utf8') as fp:
        fp.write(json.dumps(config_construct,indent=4, ensure_ascii=False))
    fp.close()
def sendEmail():
    message = MIMEText(content, 'plain', 'utf-8')  # 内容, 格式, 编码
    message['From'] = "{}".format(sender)
    message['To'] = ",".join(receivers)
    message['Subject'] = title
    try:
        smtpObj = smtplib.SMTP_SSL(mail_host, 465)  # 启用SSL发信, 端口一般是465
        smtpObj.login(mail_user, mail_pass)  # 登录验证
        smtpObj.sendmail(sender, receivers, message.as_string())  # 发送
        print("mail has been send successfully.")
    except smtplib.SMTPException as e:
        print(e)
def send_email2(SMTP_host, from_account, from_passwd, to_account, subject, content):
    email_client = smtplib.SMTP(SMTP_host)
    email_client.login(from_account, from_passwd)
    # create msg
    msg = MIMEText(content, 'plain', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')  # subject
    msg['From'] = from_account
    msg['To'] = to_account
    email_client.sendmail(from_account, to_account, msg.as_string())
    email_client.quit()
localtime = time.localtime(time.time()) # 打印本地时间
print("\n" + time.asctime(localtime))
# 通过两个网站获取ip地址
my_ip_1 = str(json.load(urlopen(ip_url_1))['ip'])
my_ip_2 = str(json.load(urlopen(ip_url_2))['ip'])
if (my_ip_1 == my_ip_2):
    ip_addr = my_ip_1
else:
    ip_addr = "IPv4 :" + my_ip_1 + "\n" + "IPv6 :" + my_ip_2
if(check_configfile_exist()['file_exist'] & check_configfile_exist()['file_write']):
    config_file = open(config_file_name,'r')
    read_context = json.load(config_file)
    old_ip = read_context['ip_addr']
    config_file.close()
    if (old_ip == ip_addr):
        print("您的地址未发生改变,无需通知~")
    else:
        content = "您的地址已变更:之前的IP为 : "+ '\n' +  old_ip + '\n' + "变更后的IP:: "+ '\n' + ip_addr  
        sendEmail()
        generate_configfile(ip_addr)
else:
    generate_configfile(ip_addr)
    content = "新的IP地址为: " + ip_addr
    sendEmail()

编辑先后执行测试:

python3 /python/AutoMail.py
# 成功则邮箱会收到邮件通知

m02ek2qf.png
m02mun4b.png

4、定期执行Python程序

使用crontab定期执行该python脚本,实现IP变更自动发送邮件

# 配置crontab
crontab -e

# 可以看到:m h dom mon dow command这几个缩写是以下英文minute, hour, day of month, month, day of week, command

配置 crontab任务

# 每隔15分钟自动执行,并将日志写入到ip.log
0,15,30,45 * * * * python3 /python/AutoMail.py >> /python/ip.log

重启 crontab 服务

service cron restart

等待变更邮件通知即可 ~

打赏
评论区
头像
友链申请 - 网站地图 - 本站主题 - 给我留言