超硬核,11个非常实用的 Python 和 Shell 脚本实例

脚本部分实例:企业微信告警、FTP 客户端、SSH 客户端、Saltstack 客户端、vCenter 客户端、获取域名 ssl 证书过期时间、发送今天的天气预报以及未来的天气趋势图;Shell 脚本部分实例:SVN 完整备份、Zabbix 监控用户密码过期、构建本地 YUM 以及上篇文章中有读者的需求(负载高时,查出占用比较高的进程脚本并存储或推送通知);...
摘要由CSDN通过智能技术生成

原文地址: https://developer.51cto.com/article/712305.html

Python 脚本部分实例:企业微信告警、FTP 客户端、SSH 客户端、Saltstack 客户端、vCenter 客户端、获取域名 ssl 证书过期时间、发送今天的天气预报以及未来的天气趋势图;

Shell 脚本部分实例:SVN 完整备份、Zabbix 监控用户密码过期、构建本地 YUM 以及上篇文章中有读者的需求(负载高时,查出占用比较高的进程脚本并存储或推送通知);

篇幅有些长,还请大家耐心翻到文末,毕竟有彩蛋。

# -*- coding: utf-8 -*-
import requests
import json
class DLF:
   def __init__(self, corpid, corpsecret):
       self.url = "https://qyapi.weixin.qq.com/cgi-bin"
       self.corpid = corpid
       self.corpsecret = corpsecret
       self._token = self._get_token()
   def _get_token(self):
       '''
       获取企业微信API接口的access_token
       :return:
       '''
       token_url = self.url + "/gettoken?corpid=%s&corpsecret=%s" %(self.corpid, self.corpsecret)
       try:
           res = requests.get(token_url).json()
           token = res['access_token']
           return token
       except Exception as e:
           return str(e)
   def _get_media_id(self, file_obj):
       get_media_url = self.url + "/media/upload?access_token={}&type=file".format(self._token)
       data = {"media": file_obj}
       try:
           res = requests.post(url=get_media_url, files=data)
           media_id = res.json()['media_id']
           return media_id
       except Exception as e:
           return str(e)
   def send_text(self, agentid, content, touser=None, toparty=None):
       send_msg_url = self.url + "/message/send?access_token=%s" % (self._token)
       send_data = {
           "touser": touser,
           "toparty": toparty,
           "msgtype": "text",
           "agentid": agentid,
           "text": {
               "content": content
           }
       }
       try:
           res = requests.post(send_msg_url, data=json.dumps(send_data))
       except Exception as e:
           return str(e)
   def send_image(self, agentid, file_obj, touser=None, toparty=None):
       media_id = self._get_media_id(file_obj)
       send_msg_url = self.url + "/message/send?access_token=%s" % (self._token)
       send_data = {
           "touser": touser,
           "toparty": toparty,
           "msgtype": "image",
           "agentid": agentid,
           "image": {
               "media_id": media_id
          }
       }
       try:
           res = requests.post(send_msg_url, data=json.dumps(send_data))
       except Exception as e:
           return str(e)

企业微信告警

此脚本通过企业微信应用,进行微信告警,可用于 Zabbix 监控。

 

FTP 客户端

通过 ftplib 模块操作 ftp 服务器,进行上传下载等操作。

# -*- coding: utf-8 -*-
from ftplib import FTP
from os import path
import copy
class FTPClient:
   def __init__(self, host, user, passwd, port=21):
       self.host = host
       self.user = user
       self.passwd = passwd
       self.port = port
       self.res = {'status': True, 'msg': None}
       self._ftp = None
       self._login()
   def _login(self):
       '''
       登录FTP服务器
       :return: 连接或登录出现异常时返回错误信息
       '''
       try:
           self._ftp = FTP()
           self._ftp.connect(self.host, self.port, timeout=30)
           self._ftp.login(self.user, self.passwd)
       except Exception as e:
           return e
   def upload(self, localpath, remotepath=None):
       '''
       上传ftp文件
       :param localpath: local file path
       :param remotepath: remote file path
       :return:
       '''
       if not localpath: return 'Please select a local file. '
       # 读取本地文件
       # fp = open(localpath, 'rb')
       # 如果未传递远程文件路径,则上传到当前目录,文件名称同本地文件
       if not remotepath:
           remotepath = path.basename(localpath)
       # 上传文件
       self._ftp.storbinary('STOR ' + remotepath, localpath)
       # fp.close()
   def download(self, remotepath, localpath=None):
       '''
       localpath
       :param localpath: local file path
       :param remotepath: remote file path
       :return:
       '''
       if not remotepath: return 'Please select a remote file. '
       # 如果未传递本地文件路径,则下载到当前目录,文件名称同远程文件
       if not localpath:
           localpath = path.basename(remotepath)
       # 如果localpath是目录的话就和remotepath的basename拼接
       if path.isdir(localpath):
           localpath = path.join(localpath, path.basename(remotepath))
       # 写入本地文件
       fp = open(localpath, 'wb')
       # 下载文件
       self._ftp.retrbinary('RETR ' + remotepath, fp.write)
       fp.close()
   def nlst(self, dir='/'):
       '''
       查看目录下的内容
       :return: 以列表形式返回目录下的所有内容
       '''
       files_list = self._ftp.nlst(dir)
       return files_list
   def rmd(self, dir=None):
       '''
       删除目录
       :param dir: 目录名称
       :return: 执行结果
       '''
       if not dir: return 'Please input dirname'
       res = copy.deepcopy(self.res)
       try:
           del_d = self._ftp.rmd(dir)
           res['msg'] = del_d
       except Exception as e:
           res['status'] = False
           res['msg'] = str(e)
       return res
   def mkd(self, dir=None):
       '''
       创建目录
       :param dir: 目录名称
       :return: 执行结果
       '''
       if not dir: return 'Please input dirname'
       res = copy.deepcopy(self.res)
       try:
           mkd_d = self._ftp.mkd(dir)
           res['msg'] = mkd_d
       except Exception as e:
           res['status'] = False
           res['msg'] = str(e)
       return res
   def del_file(self, filename=None):
       '''
       删除文件
       :param filename: 文件名称
       :return: 执行结果
       '''
       if not filename: return 'Please input filename'
       res = copy.deepcopy(self.res)
       try:
           del_f = self._ftp.delete(filename)
           res['msg'] = del_f
       except Exception as e:
           res['status'] = False
           res['msg'] = str(e)
       return res
   def get_file_size(self, filenames=[]):
       '''
       获取文件大小,单位是字节
       判断文件类型
       :param filename: 文件名称
       :return: 执行结果
       '''
       if not filenames: return {'msg': 'This is an empty directory'}
       res_l = []
       for file in filenames:
           res_d = {}
           # 如果是目录或者文件不存在就会报错
           try:
               size = self._ftp.size(file)
               type = 'f'
           except:
               # 如果是路径的话size显示 - , file末尾加/ (/dir/)
               
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值