码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 定时获取公网ip并发送邮件提醒


    前一段时间路由器刷的老毛子固件“穿透服务”中定时更新阿里DDNS失败了,用了很久第一次遇到。所以需要做个备用的措施用来实时获取公网ip信息

    1、基于python实现

    • 开启邮箱的SMTP功能
    • 拿到授权码(不是登录密码)
    1. #!/usr/bin/python
    2. # -*- coding: UTF-8 -*-
    3. import os
    4. import re
    5. import random
    6. import requests
    7. import logging
    8. import smtplib
    9. from email.mime.text import MIMEText
    10. from email.header import Header
    11. from string import Template
    12. from email.utils import parseaddr, formataddr
    13. # 输出日志格式
    14. logging.basicConfig(format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
    15. level=logging.INFO,
    16. filename='sendWANIP.log',
    17. filemode='a')
    18. def _format_addr(s):
    19. """
    20. 美化邮箱地址,用于可显示发/收件人
    21. :param s: 邮件地址
    22. :return: 美化后的地址
    23. """
    24. addr = parseaddr(s)
    25. return formataddr(addr)
    26. def get_current_ip():
    27. """
    28. 获取当前公网ip地址
    29. :return: 公网ip地址
    30. """
    31. ip_reg = re.compile("((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}")
    32. # 可根据需求增删获取ip网址
    33. api_tuple = (
    34. "http://txt.go.sohu.com/ip/soip",
    35. "https://ident.me/",
    36. "https://ifconfig.me/ip",
    37. "https://icanhazip.com/",
    38. "https://checkip.amazonaws.com/",
    39. "http://members.3322.org/dyndns/getip"
    40. )
    41. url = api_tuple[random.randrange(len(api_tuple))]
    42. # print(url)
    43. r = requests.get(url)
    44. ip = re.findall(r'\d+.\d+.\d+.\d+', r.text)
    45. # ip[0]
    46. if re.match(ip_reg,ip[0]):
    47. logging.info("从{}获取地址成功!ip={}".format(url,ip))
    48. return ip[0]
    49. else:
    50. logging.error("从{}获取地址失败!".format(url))
    51. exit(-1)
    52. def record_ip(params):
    53. """
    54. 将最新的ip记录在文件中
    55. :param params: 包含ip的参数
    56. """
    57. filename="./lastwanip"
    58. last_wan_ip=""
    59. if os.path.exists(filename):
    60. f=open(filename,'r');
    61. last_wan_ip=f.readline()
    62. f.close()
    63. logging.info("从文件中读到ip地址为:{}".format(last_wan_ip))
    64. if last_wan_ip!= params['current_ip']:
    65. f = open(filename, 'w');
    66. f.write(params['current_ip'])
    67. f.close()
    68. else:
    69. logging.info("ip地址已经是最新的,无需更新")
    70. exit(0)
    71. def send_mail(params):
    72. """
    73. 给指定用户发送邮件
    74. :param params: 发送邮件信息
    75. :return: 0: 发送成功,>0 发送失败
    76. """
    77. # 第三方 SMTP 服务
    78. mail_host = "smtp.163.com" # 设置服务器
    79. mail_user = "xxxx" # 用户名
    80. mail_pass = "xxxxxxxx" # 口令,即授权码不是账户密码
    81. receivers = sender = 'xxxx@163.com'
    82. # 邮件内容支持html格式,仿照的腾讯云模板
    83. mail_text="""
    84. IP地址

    85. style="word-break: break-all;box-sizing:border-box;text-align:center;min-width:320px; max-width:660px; border:1px solid #f6f6f6; background-color:#f7f8fa; margin:auto; padding:20px 0 30px; font-family:'helvetica neue',PingFangSC-Light,arial,'hiragino sans gb','microsoft yahei ui','microsoft yahei',simsun,sans-serif">
    86. style="width:183px; height:66px;display:block">

    87. [DynamicIP-Notice]
    88. Your current public ip address is :
    89. ${current_ip}
    90. .
    91. Sincerely,

    92. ${device}
    93. 如非本人邮件,请忽略!
  • """
  • mail = MIMEText(Template(mail_text).substitute(params), 'html', 'utf-8')
  • # 显示发件人
  • mail['From'] = _format_addr(sender)
  • mail['To'] = _format_addr(receivers)
  • # 设置邮件主题
  • subject = '[DynamicIP-Notice] {}'.format(params['current_ip'])
  • mail['Subject'] = Header(subject, 'utf-8')
  • try:
  • smtpObj = smtplib.SMTP()
  • smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
  • smtpObj.login(mail_user, mail_pass)
  • smtpObj.sendmail(sender, receivers, mail.as_string())
  • logging.info("邮件发送成功,最新ip为{}".format(params['current_ip']))
  • return 0
  • except smtplib.SMTPException as ex:
  • logging.error("邮件发送失败{},".format(ex))
  • return 1
  • if __name__=='__main__':
  • device = os.environ['COMPUTERNAME']
  • params = {"current_ip": get_current_ip(), "device": device}
  • record_ip(params)
  • send_mail(params)
  • 2、创建bat文件启动脚本

    "D:\Program Files\Python310\python.exe" D:\Code\Code\sendWANIP\sendWANIP.py

    3、Windows任务计划

    添加windows任务计划,每隔10分钟执行bat文件获取公网ip
    注意:

    • “程序或脚本”中写的可执行文件不要被引号包裹
    • 起始位置必填,为可执行文件所在的目录否则无法执行

    4、shell脚本

    路由器上跑的shell脚本,百度得来的出处忘记了,有需要的可以参考

    1. #!/bin/bash
    2. #SMTP配置 #(例子)
    3. #SMTP服务器#smtpserver=smtp.126.com
    4. #邮箱账号#fromaddress=xxxxxx@126.com
    5. #邮箱密码fromaddresspwd=xxxxxxxxxxxxx
    6. #收件人信息#toaddress=xxxxxx@qq.com 英文逗号分隔
    7. #SMTP配置
    8. smtpserver=smtp.163.com
    9. fromaddress=xxxx@163.com
    10. fromaddresspwd=xxxxxxxxxxxxx
    11. toaddress=xxxxx@163.com
    12. #文件路径,最新ip写入lastwanip.txt
    13. iptxt="/etc/storage/lastwanip.txt"
    14. #文件路径,邮件正文,写入mail文件
    15. mailtxtpath="/etc/storage/mail.txt"
    16. #获取WANIP接口
    17. newwanip=`wget http://members.3322.org/dyndns/getip -q -O -`
    18. #如接口获取不到ip,本次取消发送
    19. echo $newwanip
    20. if [ x"$newwanip" = "x" ]; then
    21. newwanip=`wget https://ifconfig.me/ip -q -O -`
    22. echo $newwanip
    23. if [ x"$newwanip" = "x" ]; then
    24. exit
    25. fi
    26. fi
    27. if [ -f $iptxt ]; then
    28. oldwanip=`cat $iptxt`
    29. else
    30. oldwanip="0.0.0.0"
    31. fi
    32. #对比上次IP,如相同则不发邮件,否则发送
    33. echo $oldwanip
    34. if [ "$newwanip" = "$oldwanip" ]; then
    35. exit
    36. fi
    37. if [ -f $mailtxtpath ]; then
    38. rm -f $mailtxtpath
    39. fi
    40. #配置邮件标题,修改“wanip”和在${newwanip} 后面加参数
    41. #不能修改代码格式,行与行之间必须空格!
    42. cat <<EOF >>$mailtxtpath
    43. Subject: WANIP:[ ${newwanip} ]
    44. 路由器型号 = RedMi AC2100
    45. IP= ${newwanip}
    46. ok
    47. To: $toaddress
    48. From: $fromaddress
    49. EOF
    50. #调用系统邮件服务
    51. sendmail -f $fromaddress -t $toaddress -S $smtpserver -au$fromaddress -ap$fromaddresspwd < $mailtxtpath
    52. #缓存最新ip地址,写入/etc/storage/lastwanip.txt"
    53. echo $newwanip > $iptxt
    54. #打印系统日志,调用logger接口
    55. logger 发现WANIP变化,外网IP= $newwanip
    56. logger ($fromaddress)已邮件通知($toaddress)

  • 相关阅读:
    多云系列|10个关键的多云战略:简介
    【Java编程题】
    如何使用 MATLAB 数学编程软件调用 Python 脚本详细教程(每周更新中)
    虚拟机macos安装brew、llvm并使用cmake构建项目
    golang使用高阶函数优化业务功能
    Python查找指定元素的索引(bool索引)
    CSP初赛知识精讲--容斥原理
    26版SPSS操作教程(高级教程第十三章)
    渗透测试常用书签
    流程审批动作概述
  • 原文地址:https://blog.csdn.net/leavemyleave/article/details/134362218
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号