编辑
2024-11-05
技术杂谈
00
请注意,本文编写于 78 天前,最后修改于 16 天前,其中某些信息可能已经过时。

目录

自定义脚本
使用crontab方式进行定时任务管理

默认自定义申请的证书 免费时间为90天 一般默认2个月就去申请更新一下
业务服务域名 最好选择晚上 因为脚本内会停止nginx访问 不过也很快
申请ssl

自定义脚本

脚本内自动去更新 更新后 推送到手机上通知

python
import subprocess import psutil # pip install psutil import requests def create_content(ipAddr, domain, content="证书更新成功,已完成自动续期。"): return f""" [IP] {ipAddr} \n [域名] {domain} \n [内容] {content} """ def push_deer_func(ipAddr, domain): """ 调用推送服务,如 PushDeer,将通知推送到手机 """ title = "域名SSL更新" pushKey = "PDUxxxZgH" # 替换为你的 PushDeer PushKey data = { "text": title, "desp": create_content(ipAddr, domain), # 组织推送消息 "type": "markdown", "pushkey": pushKey, } url = 'https://api2.pushdeer.com/message/push' try: response = requests.post(url, data=data).json() if response.get("content"): print("推送成功:", response["content"]) else: print("推送失败:", response) except Exception as e: print(f"推送时发生错误: {e}") def stop_web_service(): """ 停止 Web 服务,确保 Certbot 可以绑定到 80/443 端口 """ print("正在停止 nginx服务...") subprocess.run(["sudo", "systemctl", "stop", "nginx"], check=True) # 如果是Apache则用apache2 def start_web_service(): """ 启动 Web 服务 """ print("正在启动 nginx服务...") subprocess.run(["sudo", "systemctl", "start", "nginx"], check=True) # 如果是Apache则用apache2 def renew_ssl_certificate(): """ 执行证书续期操作,并根据是否更新成功返回结果 返回值: - True: 说明有证书被更新 - False: 没有证书需要更新 """ print("检查并更新 SSL 证书...") try: # 捕获 certbot renew 完整输出 result = subprocess.run( ["sudo", "certbot", "renew"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, # 捕获结果为文本 ) output = result.stdout # 分析输出,判断是否有证书更新 if "No renewals were attempted" in output or "no renewal failures" in output: print("没有证书需要更新。") return False elif "Congratulations, all renewals succeeded" in output or "successfully renewed" in output: print("SSL 证书更新完成!") return True else: print("证书更新时可能发生了问题,请检查输出:") print(output) return False except subprocess.CalledProcessError as e: print("Failed to renew SSL certificate") print(e) return False def process_exists(process_name): """ 检查是否有特定名称的进程正在运行 """ for proc in psutil.process_iter(['name']): if proc.info['name'] == process_name: return True return False if __name__ == "__main__": # 检查 Web 服务是否运行 if process_exists("nginx"): # 替换为你的 Web 服务进程名称,如 "nginx" 或 "apache2" stop_web_service() # 尝试更新证书 updated = renew_ssl_certificate() # 无论是否更新成功,都尝试重启 Web 服务 start_web_service() # 如果证书更新成功,则推送消息 if updated: push_deer_func( ipAddr="ip地址", domain="[域名] www, api, img", ) else: print("无证书需要更新,未推送通知。") # 0 3 * * * /usr/bin/python3 /path/to/your_script.py

使用crontab方式进行定时任务管理

此方式使用方法自行百度

shell
0 2 * * * /usr/bin/python3 /home/script_job/check_renew.py 0:分钟字段,表示在每小时的第 0 分钟。 3:小时字段,表示在每天的第 3 小时(也就是凌晨 3 点)。 15:日期字段,表示每月的第 15 天。 */2:月份字段,表示每两个月。* 表示任何月份,/2 表示步长为 2,所以这个字段表示每两个月。 *:星期字段,表示每星期。 /usr/bin/python3 /home/script_job/check_renew.py:这是命令部分,表示需要执行的命令或脚本。 这里的命令是使用 /usr/bin/python3(Python3 的路径) 来执行位于 /home/script_job/check_renew.py 的 Python 脚本。

本文作者:Freed

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!