Python3获取办公室IP并更新至腾讯云安全组

需求来源:
由于云服务器的安全组限制了只能在公司IP下远程连接,每次更新安全组时只能通过手动更新,办公室IP是动态IP,每隔三天变一次IP,时间久了就觉得麻烦,所以在查阅了腾讯云文档后发现有安全组的SDK,故而此脚本应运而生~~🤣🤣🤣

脚本说明

1.通过接口获取办公室公网IP
2.通过获取的IP与旧文件IP比对是否一致,一致则不执行后续操作
3.不一致则发送邮件及企业微信通知,
4.调用腾讯云SDK更新不同账户下办公室IP安全组规则

完整代码示例

# -*- coding: utf-8 -*-
import json
import smtplib
import requests
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.vpc.v20170312 import vpc_client, models# 查询安全组规则的版本【Version】及入站规则【Ingress】
def update_ip2security_group(SecretId, SecretKey, security_group_id, account_subject, office_ip):cred = credential.Credential(SecretId, SecretKey)# 实例化一个http选项,可选的,没有特殊需求可以跳过httpProfile = HttpProfile()httpProfile.endpoint = "vpc.tencentcloudapi.com"# 实例化一个client选项,可选的,没有特殊需求可以跳过clientProfile = ClientProfile()clientProfile.httpProfile = httpProfileclient = vpc_client.VpcClient(cred, "ap-guangzhou", clientProfile)try:# 实例化一个请求对象,每个接口都会对应一个request对象req = models.DescribeSecurityGroupPoliciesRequest()params = {"SecurityGroupId": security_group_id}req.from_json_string(json.dumps(params))# 返回的resp是一个DescribeSecurityGroupPoliciesResponse的实例,与请求对象对应resp = client.DescribeSecurityGroupPolicies(req)# 输出json格式的字符串回包json_req = resp.to_json_string()# 获取当前安全组规则的修改版本security_group_policy_version = json.loads(json_req)['SecurityGroupPolicySet']['Version']# policy_index = json.loads(json_req)['SecurityGroupPolicySet']['Ingress'][0]['PolicyIndex']# 日志打印handle_info(account_subject, security_group_policy_version, office_ip)print("当前规则如下:\n", json.loads(json_req)['SecurityGroupPolicySet'])# 根据安全的顺序的索引来替换replace_security_policy(SecretId, SecretKey, security_group_id, security_group_policy_version, office_ip)except TencentCloudSDKException as err:print(err)def replace_security_policy(SecretId, SecretKey, security_group_id, version, office_ip):"""注意:此方法是基于安全组规则索引来修改规则,如果增加了新的规则,则之前的添加的规则索引都会+1,考虑到以上SDK规则要求:1.建议在使用此方法时先記錄上一次的IP信息,根據上一次IP記錄,2.使要修改的安全组下只有一条规则即可用该方法。以上办法任选其一!"""cred = credential.Credential(SecretId, SecretKey)# 实例化一个http选项,可选的,没有特殊需求可以跳过httpProfile = HttpProfile()httpProfile.endpoint = "vpc.tencentcloudapi.com"# 实例化一个client选项,可选的,没有特殊需求可以跳过clientProfile = ClientProfile()clientProfile.httpProfile = httpProfileclient = vpc_client.VpcClient(cred, "ap-guangzhou", clientProfile)try:# 实例化一个请求对象,每个接口都会对应一个request对象req = models.ReplaceSecurityGroupPolicyRequest()params = {"SecurityGroupId": security_group_id,"SecurityGroupPolicySet": {"Version": version,"Ingress": [{"PolicyIndex": 0,"Protocol": "ALL","Port": "ALL","CidrBlock": office_ip,"Action": "ACCEPT","PolicyDescription": "办公室IP","ModifyTime": ""}]}}req.from_json_string(json.dumps(params))# 返回的resp是一个ReplaceSecurityGroupPolicyResponse的实例,与请求对象对应resp = client.ReplaceSecurityGroupPolicy(req)# 输出json格式的字符串回包print(resp.to_json_string())print("规则修改执行完毕!")except TencentCloudSDKException as err:print(err)def handle_info(account_subject, version, ip_address):print(f"当前执行修改的账户为:{account_subject},安全组修改版本为:{version},修改后的IP地址为:{ip_address}")def send_mail(old_ip, new_ip):"""smtp_server : 邮件SMTP服务器地址【这里使用的腾讯企业邮件服务器】sender_email:发件人地址sender_password:发件人邮箱授权码【可登录网页端安全设置里获取smtp授权码】receiver_email_list: 收件人邮箱列表mail_subject:邮件主题message:邮件内容正文"""smtp_server = "smtp.exmail.qq.com"sender_email = 'mail@qq.com'sender_password = "xxxxxxxx"receiver_email_list = ['zhangsan@qq.com', 'lisi@qq.com']receiver_email = receiver_email_listmail_subject = " Office IP Changed!"# 设置邮件内容msg = MIMEMultipart()msg['From'] = sender_emailmsg['To'] = ','.join(receiver_email)msg['Subject'] = mail_subjectmessage = f"The old ip is {old_ip},The new ip is {new_ip} !"# 邮件正文msg.attach(MIMEText(message, 'plain'))# 连接到QQ邮箱的SMTP服务器try:server = smtplib.SMTP_SSL(smtp_server, 465)server.login(sender_email, sender_password)server.sendmail(sender_email, receiver_email_list, msg.as_string())print("邮件发送成功")server.quit()except Exception as e:print("邮件发送失败:", e)def send_wxwork(old_ip, new_ip):wx_work_hook = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"notice1 = {"msgtype": "markdown","markdown": {"content":"# IP变动通知\n"f">旧IP:<font color=\"comment\">{old_ip}</font>\n"f">新IP:<font color=\"info\">{new_ip}</font>\n"}}response = requests.post(wx_work_hook, json=notice1)print(response.text)if __name__ == '__main__':"""1.通过接口获取办公室公网IP2.通过获取的IP与旧文件IP比对是否一致,一致则不执行后续操作3.不一致则发送邮件及企业微信通知,4.调用腾讯云SDK更新不同账户下办公室IP安全组规则"""Secret_dict = {"aa": {"account_subject": "阿里巴巴","SecretId": "SecretId","SecretKey": "SecretKey","security_group_id": "security_group_id"},"bb": {"account_subject": "腾讯","SecretId": "SecretId","SecretKey": "SecretKey","security_group_id": "security_group_id"}}aa_secretId = Secret_dict['aa']['SecretId']aa_secretKey = Secret_dict['aa']['SecretKey']aa_security_group_id = Secret_dict['aa']['security_group_id']aa_account_subject = Secret_dict['aa']['account_subject']bb_secretId = Secret_dict['bb']['SecretId']bb_secretKey = Secret_dict['bb']['SecretKey']bb_security_group_id = Secret_dict['bb']['security_group_id']bb_account_subject = Secret_dict['bb']['account_subject']# 1.获取IPres = requests.get('http://icanhazip.com/)')net_ip = res.text.strip('\n')# 2.获取旧文件IPwith open('office_ip', 'r') as f:file_ip = f.read()# 3.比对IPif net_ip == file_ip:print(f"IP一致!当前IP为:{net_ip}")exit(1)print("IP不一致")# 更新IP文件with open('office_ip', 'w') as f:f.seek(0)  # 调整句柄到开头f.write(net_ip)# 发送邮件通知及企业微信通知send_mail(file_ip, net_ip)send_wxwork(file_ip, net_ip)# 修改aa账户办公室IP安全组规则update_ip2security_group(aa_secretId, aa_secretKey, aa_security_group_id, aa_account_subject, net_ip)# 修改bb账户办公室IP安全组规则update_ip2security_group(bb_secretId, bb_secretKey, bb_security_group_id, bb_account_subject, net_ip)

最后

以上完整脚本,有需要可自身场景需求修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/698457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Git】:初识git

初识git 一.创建git仓库二.管理文件三.认识.git内部结构 一.创建git仓库 1.安装git 使用yum install git -y即可安装git。 2.创建仓库 首先创建一个git目录。 3.初始化仓库 这里面有很多内容&#xff0c;后面会将&#xff0c;主要是用来进行追踪的。 4.配置name和email 当然也…

Node.js的debug模块源码分析及在harmonyOS平台移植

Debug库 是一个小巧但功能强大的 JavaScript 调试工具库&#xff0c;可以帮助开发人员更轻松地进行调试&#xff0c;以便更快地发现和修复问题。它的主要特点是可以轻松地添加调试日志语句&#xff0c;同时在不需要调试时可以轻松地禁用它们&#xff0c;以避免在生产环境中对性…

室内外一体化定位系统

随着科技的不断发展&#xff0c;定位系统已经成为了人们生活中不可或缺的一部分。无论是在户外还是室内&#xff0c;定位服务都给人们带来了极大的便利。然而&#xff0c;传统的定位系统主要集中在室外环境&#xff0c;对于室内环境的定位还存在一定的困难。因此&#xff0c;室…

深度优先搜索-DFS

介绍 英文全称&#xff1a;Deep First Search 枚举所有完整路径来遍历所有情况的搜索方法 return不同情况的介绍 问题描述 在n件物品中&#xff0c;输入其容量与价值。给定容量&#xff0c;求物品的价值之和最大值。 思路 用DFS思想来看&#xff0c;每件物品有选择与不选择…

Spring Boot应用集成Actuator端点自定义Filter解决未授权访问的漏洞

一、前言 我们知道想要实时监控我们的应用程序的运行状态&#xff0c;比如实时显示一些指标数据&#xff0c;观察每时每刻访问的流量&#xff0c;或者是我们数据库的访问状态等等&#xff0c;需要使用到Actuator组件&#xff0c;但是Actuator有一个访问未授权问题&#xff0c;…

Postgresql源码(123)事务提交时三段资源释放分析ResourceOwnerRelease

0 总结 三段释放原因&#xff1a;因为如果先释放锁&#xff0c;没有释放一些共享资源&#xff08;比如pin住的buffer&#xff09;&#xff0c;别人拿到锁后发现我们仍然持有一些资源&#xff0c;就会有问题。所以三阶段释放主要是以锁为分界线&#xff0c;先释放锁保护的资源&…

智慧未来:人工智能驱动下的创新与发展

智慧未来&#xff1a;人工智能驱动下的创新与发展 随着人工智能技术的迅猛发展和广泛应用&#xff0c;我们正迎来一个智慧未来的时代。人工智能作为驱动力推动着创新与发展&#xff0c;改变着我们的生活、工作和社会。让我们一起探讨人工智能驱动下的创新与发展所带来的影响和…

酷开科技丨新年新玩法!酷开系统壁纸模式给客厅“换”新

甲辰龙年即将到来&#xff0c;新年新家新气象&#xff0c;快到酷开系统壁纸模式中挑选一款喜欢的壁纸&#xff0c;为新的一年增添一份美好和喜悦吧&#xff01; 酷开科技将更多的电视新玩法带给你&#xff0c;让你的电视成为家庭中的焦点&#xff01;酷开系统壁纸模式&#xf…

LabVIEW高效核磁测井仪器多线程优化

LabVIEW高效核磁测井仪器多线程优化 为提高核磁测井仪器的测试效率与性能&#xff0c;开发了基于LabVIEW的多线程优化模型。该研究针对传统的核磁测井仪器软件&#xff0c;在多任务调度测试和并行技术需求上存在的效率不高和资源利用率低的问题&#xff0c;提出了一个多线程优…

智能家居现状分析及未来展望

当前现状 家居行业经过多年发展&#xff0c;顺利完成了从无到有的进化历程&#xff0c;现正在智能化的道路上奋力驰骋&#xff0c;虽发展迅速但也面临一些问题。主要有&#xff1a; APP操作复杂、UI不统一 传统硬件厂家的优势在设备制造领域&#xff0c;让设备“上网”不是其…

SQL注入工具之SQLmap入门操作

了解SQLmap 基础操作 SQLmap是一款自动化的SQL注入工具&#xff0c;可以用于检测和利用SQL注入漏洞。 以下是SQLmap的入门操作步骤&#xff1a; 1.下载SQLmap&#xff1a;可以从官方网站&#xff08;https://sqlmap.org/&#xff09;下载最新版本的SQLmap。 2.打开终端&#…

修改单据转换规则后保存报错提示

文章目录 修改单据转换规则后保存报错提示 修改单据转换规则后保存报错提示

Neo4j导入数据之JAVA JDBC

目录结构 前言设置neo4j外部访问代码整理maven 依赖java 代码 参考链接 前言 公司需要获取neo4j数据库内容进行数据筛查&#xff0c;neo4j数据库咱也是头一次基础&#xff0c;辛辛苦苦安装好整理了安装neo4j的步骤&#xff0c;如今又遇到数据不知道怎么创建&#xff0c;关关难…

VegaPrime 2013 VP2013

Vega Prime 2013 VegaPrime 2013 VP2013

基于springboot+vue实现的大学竞赛报名管理系统

一、系统架构 前端&#xff1a;vue2 | echarts 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 教师端-统计分析 03. 教师端-竞赛通知管理 04. 教师端-获奖通告管理 05. 教师端…

学生成绩管理系统(C语言课设 )

这个学生成绩管理系统使用C语言编写&#xff0c;具有多项功能以方便管理学生信息和成绩。首先从文件中读取数据到系统中&#xff0c;并提供了多种功能&#xff08;增删改查等&#xff09;选项以满足不同的需求。 学生成绩管理系统功能: 显示学生信息增加学生信息删除学生信息…

《论文阅读》通过识别对话中的情绪原因来提高共情回复的产生 EMNLP 2021

《论文阅读》通过识别对话中的情绪原因来提高共情回复的产生 EMNLP 2021 前言简介方法实现Emotion ReasonerResponse Generator实验结果示例总结前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《Improv…

chatGPT 使用随想

一年前 chatGPT 刚出的时候&#xff0c;我就火速注册试用了。 因为自己就是 AI 行业的&#xff0c;所以想看看国际上最牛的 AI 到底发展到什么程度了. 自从一年前 chatGPT 火出圈之后&#xff0c;国际上的 AI 就一直被 OpenAI 这家公司引领潮流&#xff0c;一直到现在&#x…

《VitePress 简易速速上手小册》第9章 VitePress 的扩展与插件(2024 最新版)

文章目录 9.1 插件生态系统概述9.1.1 基础知识点解析9.1.2 重点案例:SEO 优化插件9.1.3 拓展案例 1:社交分享插件9.1.4 拓展案例 2:内容搜索插件9.2 常用插件介绍与应用9.2.1 基础知识点解析9.2.2 重点案例:使用 SEO 插件9.2.3 拓展案例 1:集成社交分享功能9.2.4 拓展案例…

24-2-22学习总结

练习题 P8637 [蓝桥杯 2016 省 B] 交换瓶子 # [蓝桥杯 2016 省 B] 交换瓶子 ## 题目描述 有 $N$ 个瓶子&#xff0c;编号 $1 \sim N$&#xff0c;放在架子上。 比如有 $5$ 个瓶子&#xff1a; $$2,1,3,5,4$$ 要求每次拿起 $2$ 个瓶子&#xff0c;交换它们的位置。 经过…