设为首页 收藏本站
查看: 1435|回复: 0

[经验分享] 批量管理python脚本

[复制链接]

尚未签到

发表于 2018-8-3 12:36:29 | 显示全部楼层 |阅读模式
  新出炉的脚本, 有错的地方还望指出,谢谢。
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  #
  #  Syscloud Operation platform.py
  #
  #  Copyright 2013 allan <allan@ALLAN-PC>
  #
  #  This program is free software; you can redistribute it and/or modify
  #  it under the terms of the GNU General Public License as published by
  #  the Free Software Foundation; either version 2 of the License, or
  #  (at your option) any later version.
  #
  #  This program is distributed in the hope that it will be useful,
  #  but WITHOUT ANY WARRANTY; without even the implied warranty of
  #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  #  GNU General Public License for more details.
  #
  #  You should have received a copy of the GNU General Public License
  #  along with this program; if not, write to the Free Software
  #  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  #  MA 02110-1301, USA.
  #
  #  QQ:286575330
  import paramiko
  import sys
  import Queue
  import threading
  import getopt
  class webmonitor:
  def __init__(self):
  try:
  self.pkey_file=‘这是密钥的路径’
  self.known_host = '/root/.ssh/known_hosts'
  self.key=paramiko.RSAKey.from_private_key_file(self.pkey_file, password=‘这里是密钥的密码’)
  except:
  print 'No such file or directory: \'/root/.ssh/jumper_rsa\''
  def help(self):
  return '''
  -h,--help            帮助页面
  -c,--command        执行的命令
  -H,--host            主机IP
  -f, --file        指定文件
  -S, --SENDFILE    传输文件模式
  -C, --COMMAND        执行命令模式
  -L, --localpath    本地文件路径
  -R, --removepath    远程服务器路径
  e.g.
  单台执行命令格式: -C -H “IP地址” -c “命令”
  批量执行命令格式: -C -f “IP地址文件” -c “命令”
  单台传送文件: -S -H “IP地址” -L &quot;本地文件路径&quot; -R “远程服务器文件路径”
  批量传送文件: -S -f &quot;IP地址文件&quot; -L “本地文件路径” -R “远程文件路径”
  '''
  def ssh(self,hostname,port,username, cmd):#ssh 远程执行命令
  ssh = paramiko.SSHClient()
  ssh.load_system_host_keys(self.known_host)
  ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  ssh.connect(hostname, port, username, password='这是远程服务器密码', pkey=self.key, allow_agent=True, look_for_keys=True)
  stdin, stdout, stderr = ssh.exec_command(cmd)
  if stderr.read() != 0:
  print '%s%s\n[OK]%s\n' % (stderr.read(),stdout.read(),hostname)
  print '========================================================================='
  else:
  print &quot;\033[1;31;40m[ERROR]%s\033[0m&quot; % hostname
  print '========================================================================='
  ssh.close()
  def sftp(self, hostname, port,username,localpath, remotepath):#SFTP 传输文件
  ssh = paramiko.Transport((hostname,port))
  ssh.connect(username=username, pkey=self.key)
  sftp = paramiko.SFTPClient.from_transport(ssh)
  sftp.put(localpath,remotepath)
  sftp.close()
  ssh.close()
  print '========================================================================='
  print &quot;OK %s&quot; % hostname
  return 0
  def isset(v):#判断定义的是否为变量
  try:
  type (eval(v))
  except:
  return 0
  else:
  return 1
  if __name__ == '__main__':
  try:
  opts, args = getopt.getopt(sys.argv[1:], &quot;L:R:CSH:c:f:h&quot;, [&quot;localpath&quot;,&quot;remotepath&quot;,&quot;COMMAND&quot;,&quot;SENDFILE&quot;,&quot;host&quot;,&quot;command&quot;,&quot;file&quot;,'help'])
  if sys.argv[1] == &quot;-S&quot;:
  for o, value in opts:
  if o in (&quot;-S&quot;,&quot;--SENDFILE&quot;):
  print &quot;MODE: SENDFILE&quot;
  elif o in (&quot;-h&quot;,&quot;--help&quot;):
  print webmonitor().help()
  elif o in (&quot;-H&quot;,&quot;--host&quot;):
  host = value
  elif o in (&quot;-f&quot;, &quot;--file&quot;):
  filein = value
  elif o in (&quot;-c&quot;,&quot;--command&quot;):
  cmd = value
  elif o in (&quot;-R&quot;,&quot;--remotepath&quot;):
  rpath = value
  elif o in (&quot;-L&quot;,&quot;--localpath&quot;):
  lpath = value
  if isset('host') and isset('lpath') and isset('rpath'):
  webmonitor().sftp(host, 22, &quot;root&quot;, lpath, rpath)
  print '========================================================================='
  elif isset('filein') and isset('lpath') and isset('rpath'):
  threads = []
  myqueue = Queue.Queue(maxsize = 0)
  f = open(filein, &quot;r&quot;)
  for ip in f:
  if ip[0] == '#':
  break
  if len(ip) == 0:
  break
  myqueue.put(ip)
  f.close()
  for x in xrange(0,myqueue.qsize()):
  if myqueue.empty():
  break
  mutex = threading.Lock()
  mutex.acquire()
  threads.append(threading.Thread(target=webmonitor().sftp, args=(myqueue.get(),22,&quot;root&quot;, lpath, rpath)))
  mutex.release()
  for t in threads:
  t.start()
  for t in threads:
  t.join()
  print '========================================================================='
  elif sys.argv[1] == &quot;-C&quot;:#执行命令模式
  for o, value in opts:
  if o in (&quot;-C&quot;,&quot;--COMMAND&quot;):
  print &quot;MODE: COMMAND&quot;
  elif o in (&quot;-H&quot;,&quot;--host&quot;):
  host = value
  elif o in (&quot;-f&quot;,&quot;--file&quot;):
  filein = value
  elif o in (&quot;-c&quot;,&quot;--command&quot;):
  cmd = value
  if isset('host') and isset('cmd'):#单台服务器执行命令
  webmonitor().ssh(host, 22, &quot;root&quot;, cmd)
  elif isset('filein') and isset('cmd'):#多台服务器批量执行命令
  threads = []
  myqueue = Queue.Queue(maxsize = 0)
  f = open(filein, &quot;r&quot;)
  for ip in f:
  if ip[0] == '#':
  break
  if len(ip) == 0:
  break
  myqueue.put(ip)
  f.close()
  for x in xrange(0,myqueue.qsize()):
  if myqueue.empty():#判断队列是否为空
  break
  mutex = threading.Lock()
  mutex.acquire()
  threads.append(threading.Thread(target=webmonitor().ssh, args=(myqueue.get(),22,&quot;root&quot;, cmd)))
  mutex.release()
  for t in threads:
  t.start()
  for t in threads:
  t.join()
  else:
  print webmonitor().help()
  except:
  print webmonitor().help()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-545934-1-1.html 上篇帖子: python并发编程之多线程编程 下篇帖子: python调用系统命令ping
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表