关系经济人类预测化学自然
投稿投诉
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产

超硬核!11个非常实用的Python和Shell拿来就用脚本

2月26日 亡命徒投稿
  这次再来给大家分享一波我工作中用到的几个脚本,主要分为:Python和Shell两个部分。
  Python脚本部分实例:企业微信告警、FTP客户端、SSH客户端、Saltstack客户端、vCenter客户端、获取域名ssl证书过期时间、发送今天的天气预报以及未来的天气趋势图;
  Shell脚本部分实例:SVN完整备份、Zabbix监控用户密码过期、构建本地YUM以及上篇文章中有读者的需求(负载高时,查出占用比较高的进程脚本并存储或推送通知);
  篇幅有些长,还请大家耐心翻到文末,毕竟有彩蛋。
  Python脚本部分企业微信告警
  此脚本通过企业微信应用,进行微信告警,可用于Zabbix监控。coding:utf8
  importrequests
  importjson
  classDLF:
  definit(self,corpid,corpsecret):
  self。urlhttps:qyapi。weixin。qq。comcgibin
  self。corpidcorpid
  self。corpsecretcorpsecret
  self。tokenself。gettoken
  defgettoken(self):
  获取企业微信API接口的accesstoken
  :return:
  tokenurlself。urlgettoken?corpidscorpsecrets(self。corpid,self。corpsecret)
  try:
  resrequests。get(tokenurl)。json
  tokenres〔accesstoken〕
  returntoken
  exceptExceptionase:
  returnstr(e)
  defgetmediaid(self,fileobj):
  getmediaurlself。urlmediaupload?accesstoken{}typefile。format(self。token)
  data{media:fileobj}
  try:
  resrequests。post(urlgetmediaurl,filesdata)
  mediaidres。json〔mediaid〕
  returnmediaid
  exceptExceptionase:
  returnstr(e)
  defsendtext(self,agentid,content,touserNone,topartyNone):
  sendmsgurlself。urlmessagesend?accesstokens(self。token)
  senddata{
  touser:touser,
  toparty:toparty,
  msgtype:text,
  agentid:agentid,
  text:{
  content:content
  }
  }
  try:
  resrequests。post(sendmsgurl,datajson。dumps(senddata))
  exceptExceptionase:
  returnstr(e)
  defsendimage(self,agentid,fileobj,touserNone,topartyNone):
  mediaidself。getmediaid(fileobj)
  sendmsgurlself。urlmessagesend?accesstokens(self。token)
  senddata{
  touser:touser,
  toparty:toparty,
  msgtype:image,
  agentid:agentid,
  image:{
  mediaid:mediaid
  }
  }
  try:
  resrequests。post(sendmsgurl,datajson。dumps(senddata))
  exceptExceptionase:
  returnstr(e)
  FTP客户端
  通过ftplib模块操作ftp服务器,进行上传下载等操作。coding:utf8
  fromftplibimportFTP
  fromosimportpath
  importcopy
  classFTPClient:
  definit(self,host,user,passwd,port21):
  self。hosthost
  self。useruser
  self。passwdpasswd
  self。portport
  self。res{status:True,msg:None}
  self。ftpNone
  self。login
  deflogin(self):
  登录FTP服务器
  :return:连接或登录出现异常时返回错误信息
  try:
  self。ftpFTP
  self。ftp。connect(self。host,self。port,timeout30)
  self。ftp。login(self。user,self。passwd)
  exceptExceptionase:
  returne
  defupload(self,localpath,remotepathNone):
  上传ftp文件
  :paramlocalpath:localfilepath
  :paramremotepath:remotefilepath
  :return:
  ifnotlocalpath:returnPleaseselectalocalfile。
  读取本地文件
  fpopen(localpath,rb)
  如果未传递远程文件路径,则上传到当前目录,文件名称同本地文件
  ifnotremotepath:
  remotepathpath。basename(localpath)
  上传文件
  self。ftp。storbinary(STORremotepath,localpath)
  fp。close
  defdownload(self,remotepath,localpathNone):
  localpath
  :paramlocalpath:localfilepath
  :paramremotepath:remotefilepath
  :return:
  ifnotremotepath:returnPleaseselectaremotefile。
  如果未传递本地文件路径,则下载到当前目录,文件名称同远程文件
  ifnotlocalpath:
  localpathpath。basename(remotepath)
  如果localpath是目录的话就和remotepath的basename拼接
  ifpath。isdir(localpath):
  localpathpath。join(localpath,path。basename(remotepath))
  写入本地文件
  fpopen(localpath,wb)
  下载文件
  self。ftp。retrbinary(RETRremotepath,fp。write)
  fp。close
  defnlst(self,dir):
  查看目录下的内容
  :return:以列表形式返回目录下的所有内容
  fileslistself。ftp。nlst(dir)
  returnfileslist
  defrmd(self,dirNone):
  删除目录
  :paramdir:目录名称
  :return:执行结果
  ifnotdir:returnPleaseinputdirname
  rescopy。deepcopy(self。res)
  try:
  deldself。ftp。rmd(dir)
  res〔msg〕deld
  exceptExceptionase:
  res〔status〕False
  res〔msg〕str(e)
  returnres
  defmkd(self,dirNone):
  创建目录
  :paramdir:目录名称
  :return:执行结果
  ifnotdir:returnPleaseinputdirname
  rescopy。deepcopy(self。res)
  try:
  mkddself。ftp。mkd(dir)
  res〔msg〕mkdd
  exceptExceptionase:
  res〔status〕False
  res〔msg〕str(e)
  returnres
  defdelfile(self,filenameNone):
  删除文件
  :paramfilename:文件名称
  :return:执行结果
  ifnotfilename:returnPleaseinputfilename
  rescopy。deepcopy(self。res)
  try:
  delfself。ftp。delete(filename)
  res〔msg〕delf
  exceptExceptionase:
  res〔status〕False
  res〔msg〕str(e)
  returnres
  defgetfilesize(self,filenames〔〕):
  获取文件大小,单位是字节
  判断文件类型
  :paramfilename:文件名称
  :return:执行结果
  ifnotfilenames:return{msg:Thisisanemptydirectory}
  resl
  forfileinfilenames:
  resd{}
  如果是目录或者文件不存在就会报错
  try:
  sizeself。ftp。size(file)
  typef
  except:
  如果是路径的话size显示,file末尾加(dir)
  size
  typed
  filefile
  resd〔filename〕file
  resd〔size〕size
  resd〔type〕type
  resl。append(resd)
  returnresl
  defrename(self,oldnameNone,newnameNone):
  重命名
  :paramoldname:旧的文件或者目录名称
  :paramnewname:新的文件或者目录名称
  :return:执行结果
  ifnotoldnameornotnewname:returnPleaseinputoldnameandnewname
  rescopy。deepcopy(self。res)
  try:
  renamefself。ftp。rename(oldname,newname)
  res〔msg〕renamef
  exceptExceptionase:
  res〔status〕False
  res〔msg〕str(e)
  returnres
  defclose(self):
  退出ftp连接
  :return:
  try:
  向服务器发送quit命令
  self。ftp。quit
  exceptException:
  returnNoresponsefromserver
  finally:
  客户端单方面关闭连接
  self。ftp。close
  SSH客户端
  此脚本仅用于通过key连接,如需要密码连接,简单修改下即可。coding:utf8
  importparamiko
  classSSHClient:
  definit(self,host,port,user,pkey):
  self。sshhosthost
  self。sshportport
  self。sshuseruser
  self。privatekeyparamiko。RSAKey。fromprivatekeyfile(pkey)
  self。sshNone
  self。connect
  defconnect(self):
  self。sshparamiko。SSHClient
  self。ssh。setmissinghostkeypolicy(paramiko。AutoAddPolicy)
  try:
  self。ssh。connect(hostnameself。sshhost,portself。sshport,usernameself。sshuser,pkeyself。privatekey,timeout10)
  except:
  returnsshconnectfail
  defexecutecommand(self,command):
  stdin,stdout,stderrself。ssh。execcommand(command)
  outstdout。read
  errstderr。read
  returnout,err
  defclose(self):
  self。ssh。close
  Saltstack客户端
  通过api对Saltstack服务端进行操作,执行命令。!usrbinenvpython
  coding:utf8
  importrequests
  importjson
  importcopy
  classSaltApi:
  定义saltapi接口的类
  初始化获得token
  definit(self):
  self。urlhttp:172。85。10。21:8000
  self。usernamesaltapi
  self。passwordsaltapi
  self。headers{Contenttype:applicationjson}
  self。params{client:local,fun:None,tgt:None,arg:None}
  self。loginurlself。urllogin
  self。loginparams{username:self。username,password:self。password,eauth:pam}
  self。tokenself。getdata(self。loginurl,self。loginparams)〔token〕
  self。headers〔XAuthToken〕self。token
  defgetdata(self,url,params):
  请求url获取数据
  :paramurl:请求的url地址
  :paramparams:传递给url的参数
  :return:请求的结果
  senddatajson。dumps(params)
  requestrequests。post(url,datasenddata,headersself。headers)
  responserequest。json
  resultdict(response)
  returnresult〔return〕〔0〕
  defgetauthkeys(self):
  获取所有已经认证的key
  :return:
  datacopy。deepcopy(self。params)
  data〔client〕wheel
  data〔fun〕key。listall
  resultself。getdata(self。url,data)
  try:
  returnresult〔data〕〔return〕〔minions〕
  exceptExceptionase:
  returnstr(e)
  defgetgrains(self,tgt,argid):
  获取系统基础信息
  :tgt:目标主机
  :return:
  datacopy。deepcopy(self。params)
  iftgt:
  data〔tgt〕tgt
  else:
  data〔tgt〕
  data〔fun〕grains。item
  data〔arg〕arg
  resultself。getdata(self。url,data)
  returnresult
  defexecutecommand(self,tgt,funcmd。run,argNone,tgttypelist,saltasyncFalse):
  执行saltstack模块命令,类似于saltcmd。runcommand
  :paramtgt:目标主机
  :paramfun:模块方法可为空
  :paramarg:传递参数可为空
  :return:执行结果
  datacopy。deepcopy(self。params)
  ifnottgt:return{status:False,msg:targethostnotexist}
  ifnotarg:
  data。pop(arg)
  else:
  data〔arg〕arg
  iftgt!:
  data〔tgttype〕tgttype
  ifsaltasync:data〔client〕localasync
  data〔fun〕fun
  data〔tgt〕tgt
  resultself。getdata(self。url,data)
  returnresult
  defjobs(self,fundetail,jidNone):
  任务
  :paramfun:active,detail
  :paramjod:JobID
  :return:任务执行结果
  data{client:runner}
  data〔fun〕fun
  iffundetail:
  ifnotjid:return{success:False,msg:jobidisnone}
  data〔fun〕jobs。lookupjid
  data〔jid〕jid
  else:
  return{success:False,msg:funisactiveordetail}
  resultself。getdata(self。url,data)
  returnresult
  vCenter客户端
  通过官方SDK对vCenter进行日常操作,此脚本是我用于cmdb平台的,自动获取主机信息,存入数据库。frompyVim。connectimportSmartConnect,Disconnect,SmartConnectNoSSL
  frompyVmomiimportvim
  fromassetimportmodels
  importatexit
  classVmware:
  definit(self,ip,user,password,port,idc,vcenterid):
  self。ipip
  self。useruser
  self。passwordpassword
  self。portport
  self。idcididc
  self。vcenteridvcenterid
  defgetobj(self,content,vimtype,nameNone):
  列表返回,name可以指定匹配的对象
  containercontent。viewManager。CreateContainerView(content。rootFolder,vimtype,True)
  obj〔viewforviewincontainer。view〕
  returnobj
  defgetesxiinfo(self):
  宿主机信息
  esxihost{}
  res{connectstatus:True,msg:None}
  try:
  connectthisthing
  siSmartConnectNoSSL(hostself。ip,userself。user,pwdself。password,portself。port,connectionPoolTimeout60)
  exceptExceptionase:
  res〔connectstatus〕False
  try:
  res〔msg〕(sCaughtvmodlfault:e。msg)(self。ip)
  exceptExceptionase:
  res〔msg〕s:connectionerror(self。ip)
  returnres
  disconnectthisthing
  atexit。register(Disconnect,si)
  contentsi。RetrieveContent
  esxiobjself。getobj(content,〔vim。HostSystem〕)
  foresxiinesxiobj:
  esxihost〔esxi。name〕{}
  esxihost〔esxi。name〕〔idcid〕self。idcid
  esxihost〔esxi。name〕〔vcenterid〕self。vcenterid
  esxihost〔esxi。name〕〔serverip〕esxi。name
  esxihost〔esxi。name〕〔manufacturer〕esxi。summary。hardware。vendor
  esxihost〔esxi。name〕〔servermodel〕esxi。summary。hardware。model
  foriinesxi。summary。hardware。otherIdentifyingInfo:
  ifisinstance(i,vim。host。SystemIdentificationInfo):
  esxihost〔esxi。name〕〔serversn〕i。identifierValue
  系统名称
  esxihost〔esxi。name〕〔systemname〕esxi。summary。config。product。fullName
  cpu总核数
  esxicputotalesxi。summary。hardware。numCpuThreads
  内存总量GB
  esximemorytotalesxi。summary。hardware。memorySize10241024strongtoutiaooriginspanclasshighlighttext1024strong
  获取硬盘总量GB
  esxidisktotalstrongtoutiaooriginspanclasshighlighttext0strong
  fordsinesxi。datastore:
  esxidisktotalds。summary。capacity10241024strongtoutiaooriginspanclasshighlighttext1024strong
  默认配置4核8G100G,根据这个配置计算剩余可分配虚拟机
  defaultconfigure{
  cpu:4,
  memory:8,
  disk:strongtoutiaooriginspanclasshighlighttext100strong
  }
  esxihost〔esxi。name〕〔vmhost〕
  vmusagetotalcpustrongtoutiaooriginspanclasshighlighttext0strong
  vmusagetotalmemorystrongtoutiaooriginspanclasshighlighttext0strong
  vmusagetotaldiskstrongtoutiaooriginspanclasshighlighttext0strong
  虚拟机信息
  forvminesxi。vm:
  hostinfo{}
  hostinfo〔vmname〕vm。name
  hostinfo〔powerstatus〕vm。runtime。powerState
  hostinfo〔cputotalkernel〕str(vm。config。hardware。numCPU)核
  hostinfo〔memorytotal〕str(vm。config。hardware。memoryMB)MB
  hostinfo〔systeminfo〕vm。config。guestFullName
  diskinfo
  disktotalstrongtoutiaooriginspanclasshighlighttext0strong
  fordinvm。config。hardware。device:
  ifisinstance(d,vim。vm。device。VirtualDisk):
  disktotald。capacityInKB1024strongtoutiaooriginspanclasshighlighttext1024strong
  diskinfod。deviceInfo。label:str((d。capacityInKB)10241024)GB,
  hostinfo〔diskinfo〕diskinfo
  esxihost〔esxi。name〕〔vmhost〕。append(hostinfo)
  计算当前宿主机可用容量:总量已分配的
  ifhostinfo〔powerstatus〕poweredOn:
  vmusagetotalcpuvm。config。hardware。numCPU
  vmusagetotaldiskdisktotal
  vmusagetotalmemory(vm。config。hardware。memoryMB1024)
  esxicpufreeesxicputotalvmusagetotalcpu
  esximemoryfreeesximemorytotalvmusagetotalmemory
  esxidiskfreeesxidisktotalvmusagetotaldisk
  esxihost〔esxi。name〕〔cpuinfo〕Total:d核,Free:d核(esxicputotal,esxicpufree)
  esxihost〔esxi。name〕〔memoryinfo〕Total:dGB,Free:dGB(esximemorytotal,esximemoryfree)
  esxihost〔esxi。name〕〔diskinfo〕Total:dGB,Free:dGB(esxidisktotal,esxidiskfree)
  计算cpu内存磁盘按照默认资源分配的最小值,即为当前可分配资源
  ifesxicpufree4oresximemoryfree8oresxidiskfree100:
  freeallocationvmhoststrongtoutiaooriginspanclasshighlighttext0strong
  else:
  freeallocationvmhostint(min(
  〔
  esxicpufreedefaultconfigure〔cpu〕,
  esximemoryfreedefaultconfigure〔memory〕,
  esxidiskfreedefaultconfigure〔disk〕
  〕
  ))
  esxihost〔esxi。name〕〔freeallocationvmhost〕freeallocationvmhost
  esxihost〔connectstatus〕True
  returnesxihost
  defwritetodb(self):
  esxihostself。getesxiinfo
  连接失败
  ifnotesxihost〔connectstatus〕:
  returnesxihost
  delesxihost〔connectstatus〕
  formachineipinesxihost:
  物理机信息
  esxihostdictesxihost〔machineip〕
  虚拟机信息
  virtualhostesxihost〔machineip〕〔vmhost〕
  delesxihost〔machineip〕〔vmhost〕
  objmodels。EsxiHost。objects。create(esxihostdict)
  obj。save
  forhostinfoinvirtualhost:
  hostinfo〔managementhostid〕obj。id
  obj2models。virtualHost。objects。create(hostinfo)
  obj2。save
  获取域名ssl证书过期时间
  用于zabbix告警importre
  importsys
  importtime
  importsubprocess
  fromdatetimeimportdatetime
  fromioimportStringIO
  defmain(domain):
  fStringIO
  commfcurlIvshttps:{domain}connecttimeout10
  resultsubprocess。getstatusoutput(comm)
  f。write(result〔1〕)
  try:
  mre。search(startdate:(。?)。?expiredate:(。?)。?commonname:(。?)。?issuer:CN(。?),f。getvalue,re。S)
  startdatem。group(1)
  expiredatem。group(2)
  commonnamem。group(3)
  issuerm。group(4)
  exceptExceptionase:
  return999999999
  time字符串转时间数组
  startdatetime。strptime(startdate,bdH:M:SYGMT)
  startdatesttime。strftime(YmdH:M:S,startdate)
  datetime字符串转时间数组
  expiredatedatetime。strptime(expiredate,bdH:M:SYGMT)
  expiredatestdatetime。strftime(expiredate,YmdH:M:S)
  剩余天数
  remaining(expiredatedatetime。now)。days
  returnremaining
  ifnamemain:
  domainsys。argv〔1〕
  remainingdaysmain(domain)
  print(remainingdays)
  发送今天的天气预报以及未来的天气趋势图
  此脚本用于给老婆大人发送今天的天气预报以及未来的天气趋势图,现在微信把网页端禁止了,没法发送到微信了,我是通过企业微信进行通知的,需要把你老婆大人拉到企业微信,无兴趣的小伙伴跳过即可。coding:utf8
  importrequests
  importjson
  importdatetime
  defweather(city):
  urlhttp:wthrcdn。etouch。cnweathermini?cityscity
  try:
  datarequests。get(url)。json〔data〕
  citydata〔city〕
  ganmaodata〔ganmao〕
  todayweatherdata〔forecast〕〔0〕
  res老婆今天是{}今天天气概况城市:{:10}时间:{:10}高温:{:10}低温:{:10}风力:{:10}风向:{:10}天气:{:10}稍后会发送近期温度趋势图,请注意查看。
  。format(
  ganmao,
  city,
  datetime。datetime。now。strftime(Ymd),
  todayweather〔high〕。split〔1〕,
  todayweather〔low〕。split〔1〕,
  todayweather〔fengli〕。split(〔)〔2〕。split(〕)〔0〕,
  todayweather〔fengxiang〕,todayweather〔type〕,
  )
  return{sourcedata:data,res:res}
  exceptExceptionase:
  returnstr(e)
  获取天气预报趋势图
  python
  coding:utf8
  importmatplotlib。pyplotasplt
  importre
  importdatetime
  defFutureweatherstates(forecast,savepath,daynum5):
  展示未来的天气预报趋势图
  :paramforecast:天气预报预测的数据
  :paramdaynum:未来几天
  :return:趋势图
  futureforecastforecast
  dict{}
  foriinrange(daynum):
  data
  datefutureforecast〔i〕〔date〕
  dateint(re。findall(d,date)〔0〕)
  data。append(int(re。findall(d,futureforecast〔i〕〔high〕)〔0〕))
  data。append(int(re。findall(d,futureforecast〔i〕〔low〕)〔0〕))
  data。append(futureforecast〔i〕〔type〕)
  dict〔date〕data
  datalistsorted(dict。items)
  date
  hightemperature
  lowtemperature
  foreachindatalist:
  date。append(each〔0〕)
  hightemperature。append(each〔1〕〔0〕)
  lowtemperature。append(each〔1〕〔1〕)
  figplt。plot(date,hightemperature,r,date,lowtemperature,b)
  currentdatedatetime。datetime。now。strftime(Ym)
  plt。rcParams〔font。sansserif〕〔SimHei〕
  plt。rcParams〔axes。unicodeminus〕False
  plt。xlabel(currentdate)
  plt。ylabel()
  plt。legend(〔高温,低温〕)
  plt。xticks(date)
  plt。title(最近几天温度变化趋势)
  plt。savefig(savepath)
  发送到企业微信
  python
  coding:utf8
  importrequests
  importjson
  classDLF:
  definit(self,corpid,corpsecret):
  self。urlhttps:qyapi。weixin。qq。comcgibin
  self。corpidcorpid
  self。corpsecretcorpsecret
  self。tokenself。gettoken
  defgettoken(self):
  获取企业微信API接口的accesstoken
  :return:
  tokenurlself。urlgettoken?corpidscorpsecrets(self。corpid,self。corpsecret)
  try:
  resrequests。get(tokenurl)。json
  tokenres〔accesstoken〕
  returntoken
  exceptExceptionase:
  returnstr(e)
  defgetmediaid(self,fileobj):
  getmediaurlself。urlmediaupload?accesstoken{}typefile。format(self。token)
  data{media:fileobj}
  try:
  resrequests。post(urlgetmediaurl,filesdata)
  mediaidres。json〔mediaid〕
  returnmediaid
  exceptExceptionase:
  returnstr(e)
  defsendtext(self,agentid,content,touserNone,topartyNone):
  sendmsgurlself。urlmessagesend?accesstokens(self。token)
  senddata{
  touser:touser,
  toparty:toparty,
  msgtype:text,
  agentid:agentid,
  text:{
  content:content
  }
  }
  try:
  resrequests。post(sendmsgurl,datajson。dumps(senddata))
  exceptExceptionase:
  returnstr(e)
  defsendimage(self,agentid,fileobj,touserNone,topartyNone):
  mediaidself。getmediaid(fileobj)
  sendmsgurlself。urlmessagesend?accesstokens(self。token)
  senddata{
  touser:touser,
  toparty:toparty,
  msgtype:image,
  agentid:agentid,
  image:{
  mediaid:mediaid
  }
  }
  try:
  resrequests。post(sendmsgurl,datajson。dumps(senddata))
  exceptExceptionase:
  returnstr(e)
  main脚本
  coding:utf8
  fromplugins。weatherforecastimportweather
  fromplugins。trendchartimportFutureweatherstates
  fromplugins。sendwechatimportDLF
  importos
  企业微信相关信息
  corpidxxx
  corpsecretxxx
  agentidxxx
  天气预报趋势图保存路径
  pathos。path。dirname(os。path。abspath(file))
  savepathos。path。join(path,。tmpweatherforecast。jpg)
  获取天气预报信息
  contentweather(大兴)
  发送文字消息
  dlfDLF(corpid,corpsecret)
  dlf。sendtext(agentidagentid,contentcontent〔res〕,toparty1)
  生成天气预报趋势图
  Futureweatherstates(content〔sourcedata〕〔forecast〕,savepath)
  发送图片消息
  fileobjopen(savepath,rb)
  dlf。sendimage(agentidagentid,toparty1,fileobjfileobj)
  Shell脚本部分SVN完整备份
  通过hotcopy进行SVN完整备份,备份保留7天。!binbash
  Filename:svnbackuprepos。sh
  Date:20201214
  Author:JakeTian
  Email:JakeTian。com
  Crontab:5923binbashBASEPATHsvnbackuprepos。shdev21
  Notes:将脚本加入crontab中,每天定时执行
  Description:SVN完全备份
  sete
  SRCPATHoptsvndata
  DSTPATHdatasvnbackup
  LOGFILEDSTPATHlogssvnbackup。log
  SVNBACKUPCbinsvnadminhotcopy
  SVNLOOKCbinsvnlookyoungest
  TODAY(dateF)
  cdSRCPATH
  ALLREPOS(find。maxdepth1typed!namehttpda!namebaktrd。)
  创建备份目录,备份脚本ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a目录
  testdDSTPATHmkdirpDSTPATH
  testdDSTPATHlogsmkdirDSTPATHlogs
  testdDSTPATHTODAYmkdirDSTPATHTODAY
  备份repos文件
  forrepoinALLREPOS
  do
  SVNBACKUPCSRCPATHrepoDSTPATHTODAYrepo
  判断备份是否完成
  ifSVNLOOKCDSTPATHTODAYthen
  echoTODAY:repoBackupSuccessLOGFILE
  else
  echoTODAY:repoBackupFailLOGFILE
  fi
  done
  备份用户密码文件和权限文件
  cppauthzaccess。confDSTPATHTODAY
  ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件转储
  mvLOGFILELOGFILETODAY
  删除七天前的备份
  sevendaysago(dated7daysagoF)
  rmrfDSTPATHsevendaysago
  zabbix监控用户密码过期
  用于Zabbix监控Linux系统用户(shell为binbash和binsh)密码过期,密码有效期剩余7天触发加自动发现用户。!binbash
  diskarray(awkF:NFbinbashbinsh{print1}etcpasswd)
  length{diskarray〔〕}
  printf{
  printfdata:〔
  for((i0;i))
  do
  printf{
  printf{USERNAME}:{diskarray〔i〕}}
  if〔ilt〔length1〕〕;then
  printf,
  fi
  done
  printf〕
  printf}
  检查用户密码过期
  !binbash
  exportLANGenUS。UTF8
  SEVENDAYSAGO(dated7days)
  user1
  将Sep09,2018格式的时间转换成unix时间
  expiresdate(sudochageluserawkF:Passwordexpires{printNF}sednsp)
  if〔〔expiresdate!never〕〕;then
  expiresdate(datedexpiresdates)
  if〔expiresdateleSEVENDAYSAGO〕;then
  echo1
  else
  echo0
  fi
  else
  echo0
  fi
  构建本地YUM
  通过rsync的方式同步yum,通过nginx只做httpyum站点;
  但是centos6的镜像最近都不能用了,国内貌似都禁用了,如果找到合适的自行更换地址。!binbash
  更新yum镜像
  RsyncCommandrsyncrvutHPdeletedeleteafterdelayupdatesbwlimit1000
  DIRappyumData
  LogDirDIRlogs
  Centos6BaseDIRCentos6x8664Base
  Centos7BaseDIRCentos7x8664Base
  Centos6EpelDIRCentos6x8664Epel
  Centos7EpelDIRCentos7x8664Epel
  Centos6SaltDIRCentos6x8664Salt
  Centos7SaltDIRCentos7x8664Salt
  Centos6UpdateDIRCentos6x8664Update
  Centos7UpdateDIRCentos7x8664Update
  Centos6DockerDIRCentos6x8664Docker
  Centos7DockerDIRCentos7x8664Docker
  Centos6Mysql57DIRCentos6x8664MysqlMysql5。7
  Centos7Mysql57DIRCentos7x8664MysqlMysql5。7
  Centos6Mysql80DIRCentos6x8664MysqlMysql8。0
  Centos7Mysql80DIRCentos7x8664MysqlMysql8。0
  MirrorDomainrsync:rsync。mirrors。ustc。edu。cn
  目录不存在就创建
  checkdir{
  fordirin
  do
  testddirmkdirpdir
  done
  }
  检查rsync同步结果
  checkrsyncstatus{
  if〔?eq0〕;then
  echorsyncsuccess1
  else
  echorsyncfail1
  fi
  }
  checkdirDIRLogDirCentos6BaseCentos7BaseCentos6EpelCentos7EpelCentos6SaltCentos7SaltCentos6UpdateCentos7UpdateCentos6DockerCentos7DockerCentos6Mysql57Centos7Mysql57Centos6Mysql80Centos7Mysql80
  Baseyumrepo
  RsyncCommandMirrorDomainrepocentos6osx8664Centos6BaseLogDircentos6Base。log21
  checkrsyncstatusLogDircentos6Base。log
  RsyncCommandMirrorDomainrepocentos7osx8664Centos7BaseLogDircentos7Base。log21
  checkrsyncstatusLogDircentos7Base。log
  Epelyumrepo
  RsyncCommandMirrorDomainrepoepel6x8664Centos6EpelLogDircentos6Epel。log21
  checkrsyncstatusLogDircentos6Epel。log
  RsyncCommandMirrorDomainrepoepel7x8664Centos7EpelLogDircentos7Epel。log21
  checkrsyncstatusLogDircentos7Epel。log
  SaltStackyumrepo
  RsyncCommandMirrorDomainreposaltyumredhat6x8664Centos6SaltLogDircentos6Salt。log21
  lnsCentos6Saltarchive(lsCentos6Saltarchivetail1)Centos6Saltlatest
  checkrsyncstatusLogDircentos6Salt。log
  RsyncCommanMirrorDomainreposaltyumredhat7x8664Centos7SaltLogDircentos7Salt。log21
  checkrsyncstatusLogDircentos7Salt。log
  lnsCentos7Saltarchive(lsCentos7Saltarchivetail1)Centos7Saltlatest
  Dockeryumrepo
  RsyncCommandMirrorDomainrepodockercelinuxcentos7x8664stableCentos7DockerLogDircentos7Docker。log21
  checkrsyncstatusLogDircentos7Docker。log
  centosupdateyumrepo
  RsyncCommandMirrorDomainrepocentos6updatesx8664Centos6UpdateLogDircentos6Update。log21
  checkrsyncstatusLogDircentos6Update。log
  RsyncCommandMirrorDomainrepocentos7updatesx8664Centos7UpdateLogDircentos7Update。log21
  checkrsyncstatusLogDircentos7Update。log
  mysql5。7yumrepo
  RsyncCommandMirrorDomainrepomysqlrepoyummysql5。7communityel6x8664Centos6Mysql57LogDircentos6Mysql5。7。log21
  checkrsyncstatusLogDircentos6Mysql5。7。log
  RsyncCommandMirrorDomainrepomysqlrepoyummysql5。7communityel7x8664Centos7Mysql57LogDircentos7Mysql5。7。log21
  checkrsyncstatusLogDircentos7Mysql5。7。log
  mysql8。0yumrepo
  RsyncCommandMirrorDomainrepomysqlrepoyummysql8。0communityel6x8664Centos6Mysql80LogDircentos6Mysql8。0。log21
  checkrsyncstatusLogDircentos6Mysql8。0。log
  RsyncCommandMirrorDomainrepomysqlrepoyummysql8。0communityel7x8664Centos7Mysql80LogDircentos7Mysql8。0。log21
  checkrsyncstatusLogDircentos7Mysql8。0。log
  读者需求解答
  负载高时,查出占用比较高的进程脚本并存储或推送通知
  这部分内容是上篇Shell脚本实例中底部读者留言的需求,如下:!binbash
  物理cpu个数
  physicalcpucount(egrepphysicalidproccpuinfosortuniqwcl)
  单个物理cpu核数
  physicalcpucores(egrepcpucoresproccpuinfouniqawk{printNF})
  总核数
  totalcpucores((physicalcpucountphysicalcpucores))
  分别是一分钟、五分钟、十五分钟负载的阈值,其中有一项超过阈值才会触发
  oneminloadthresholdtotalcpucores
  fiveminloadthreshold(awkBEGIN{printtotalcpucores0。8})
  fifteenminloadthreshold(awkBEGIN{printtotalcpucores0。7})
  分别是分钟、五分钟、十五分钟负载平均值
  oneminload(uptimeawk{print(NF2)}trd,)
  fiveminload(uptimeawk{print(NF1)}trd,)
  fifteenminload(uptimeawk{printNF}trd,)
  获取当前cpu内存磁盘io信息,并写入ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件
  如果需要发送消息或者调用其他,请自行编写函数即可
  getinfo{
  logdircpuhighscriptlog
  testdlogdirmkdirlogdir
  pseouser,pid,cpu,stat,time,commandsortcpuhead10logdircputop10。log
  pseouser,pid,mem,rss,vsz,stat,time,commandsortmemhead10logdirmemtop10。log
  iostatdx110logdirdiskio10。log
  }
  exportfgetinfo
  echooneminloadoneminloadthresholdfiveminloadfiveminloadthresholdfifteenminloadfifteenminloadthreshold
  awk{if(123456)system(getinfo)}
  以上,就是今天分享的全部内容了。
  希望大家通过这些案例能够学以致用,结合自身的实际场景进行运用,从而提高自己的工作效率。
投诉 评论 转载

今日美女031期君子于役对离家在外的情人的思念和忧虑君子于役这首诗表达了作者对离家在外的情人的思念和忧虑。在这首诗中,我们可以感受到作者内心的焦虑和孤独,他渴望情人早日归来,与他相聚在一起。这种情感不仅是在古代的役场……引力不等于吸引力!引力是宇宙间一个物体和另一个物体之间的作用力。举个例子,你和你口袋中的硬币之间有引力作用;你和大街上与你擦肩而过的人之间也有引力作用(虽然这两种情况下,引力都过于微弱,你……原神2。4UP角色深渊表现,申鹤魈甘雨钟离强度分析有句话说的好。一代版本一代神还有一句话叫做铁打的辅助,流水的C。的确是如此,游戏中辅助的地位一般比较稳固,寿命悠久,而输出则是竞争和替换可能性比较激烈。那么问题来了。2。4当期……四款折叠屏手机推荐最低还不到一部iPhone13Pro的价钱要说现如今机圈科技含量最高的产品是什么,答案肯定是折叠屏手机,展开后能够获得平板电脑般的大屏体验,折叠后与一台普通手机无异。随着技术发展,折叠屏手机的成本也已大幅度下降,售价已……优秀的父母,都在坚持为孩子做这一件事答案是阅读。阅读不仅能帮助孩子调适情绪、控制冲动,还可以帮助孩子发展正向思维、培养心理韧性以及解决问题的能力。对于处理小孩的情绪,大量阅读非常重要,因为透过故事来进……厦门96岁中山公园,承载了几代人的欢乐,儿童岛动物园都免费!从今天起记录我的2023记得小时候每到春节,最开心的就是爸妈带着去中山公园看花灯。那时候五光十色的花灯,是童年最大的乐趣。后来花灯不在中山公园举行了,长大了也去得少了,但……东瀛宝马马自达质量不敢信今天不谈马自达操控,只谈质量!西藏路途中拍摄我的马自达昂克赛拉1。5(马3)第7年了,动力够用,跑了快8万公里。各种中长途游玩和日常上班,到目前为止除了正常保养从来……2023年人工智能趋势OpenAIGhatGPT4VS谷歌广2023年人工智能趋势:OpenAIGhatGPT4VS谷歌广告业务大战在即?新年快乐!2023刚开年OpenAI就宣布今年继ChatGPT3对话式聊天机器人之后要推出下……50!陈婉婷率队2场大胜,孙雯接班人建功,提前1轮晋级8强正文近期女乙联赛拉开帷幕,万众瞩目的焦点也随之而来,此前参加过竞聘中国女足主帅的香港教头陈婉婷,目前以海南琼中女足主教练的身份率队出征女乙联赛,并先后豪取50、110两场……超硬核!11个非常实用的Python和Shell拿来就用脚本这次再来给大家分享一波我工作中用到的几个脚本,主要分为:Python和Shell两个部分。Python脚本部分实例:企业微信告警、FTP客户端、SSH客户端、Saltst……左青龙馒头山,义净寺的建筑之美,惊艳了人间烟火每次去泰安经过张夏时,在张夏火车站附近的半山腰,有一片金碧辉煌的建筑,远观非常惊艳,色彩艳丽,建筑群体错落有致,给人印象最深的就是建筑群东首之上的的群山逶迤,千岩万壑。壁立千仞……李东华自愿放弃中国籍,入籍瑞士夺奥运金牌,为何反被国人赞扬1994年,何智丽入日本籍5年后,在亚运会上击败大魔王邓亚萍,被无数国人大骂叛徒。从此之后,何智丽每年回国看望家人,都要偷偷摸摸,生怕被人认出。1996年,原国家队……
芹菜银耳拌腰果降血压还美容养颜庆余年是原班人马出演吗庆余年有李沁和肖战吗中国家电产业为何没出戴森?男生正装穿搭超全攻略学会这些你就是年会如何让星座付出真爱楼市销售热潮来袭,各国房价创新高,未来国内情况又会如何?完美无缺造句用完美无缺造句大全半导体领域未来两年最具爆发翻倍潜力的龙头股名单,建议收藏细品购买新能源车需要考虑电池的材料吗?断念2020年,日本上班族平均收入为433万日元,约24。43万不会抄送邮件说明你根本不懂职场政治
消防解封申请书围巾上的浮毛怎么处理数码知识华为mate30pro可以设置侧边不显示内容吗侧边内睡眠应该先睡心后睡身什么意思热博聚热点网 三合一防雷器功能及特点介绍图文英语教师个人辞职报告胡杨林致知怎么清理窗户的油污窗子上的油渍怎么洗掉端午交通违章如何处理?诞生至今已有169年,为什么还这么火?辞职申请书一些关于名人励志的故事

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找菏泽德阳山西湖州宝鸡上海茂名内江三亚信阳长春北海西安安徽黄石烟台沧州湛江肇庆鹤壁六安韶关成都钦州