棒子折腾记(二)- Linux IP变化邮件提醒
效果
一、前言
最近折腾了下 内网穿透 ,,可能是家里的设备不太支持吧(可能是运营商禁用了);反正就是穿透不出去(但是连接到内网之后再访问就又可以了,估计是运营商设备把外网给禁了) ::(吐)
正好发现设备支持 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
# 安装依赖包
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
2、创建目录及相关文件
# 创建文件夹python
mkdir /python
# 创建相关文件
touch /python/AutoMail.py
touch /python/ip.log
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
# 成功则邮箱会收到邮件通知
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
等待变更邮件通知即可 :@(内伤) ~