多线程ssh工具

2011年7月18日 | 分类: 乱七八糟 | 标签: , , ,

多线程SSh工具Tssh-1.3

程序执行前请安装pextect模块安装很简单 python setup.py install 我的python版本 2.5 和 2.4.3测试程序都没有问题
推荐大家使用 2.5及以上版本 2.5以下下版本不支持  except:  finally: 混合使用 可能会有问题

Tssh-1.3 修补了前面版本的一个小Bug就是连接服务器超时的时候会报出一大堆错误
更新了密钥使用的方式前版本对使用密钥的人是一个困扰
支持主机列表中开头#号注释
建议使用Python 2.5 以上版本
使用帮助
如果密码不同就将密码写在列表中格式内容为 IP:密码
如果使用密钥做认证就直接使用 -f 指定一个 IP 列表就可以 别的就不用在指定了 但是别忘了指定 command 哦
支持 sudo  直接在 -c “sudo 命令” 就可以密码会以当密码做认证
-h 会得到程序帮助
-f 指定一个linux主机列表
-u 指定用户名
-p 指定密码  当你的列表中已经存在密码请不要尝试输入-p 参数 谢谢
-c 指定要指定的命令 多个命令使用 ; 分号或者 && 来连接
-t 指定线程数目如果机器比较多的话建议指定一下 默认程序会以列表中机器数目来创建线程
-s 将执行结果输出到标准输出.我不建议这样使用因为线程的处理比较复杂你并不知道谁快谁慢,导致输出的结果很乱
默认情况程序会将每个IP的执行结果保存在脚本执行目录下Tssh/log/中大家可以查看执行结果

原文http://bbs.linuxtone.org/thread-7170-1-1.html

pssh—多线程ssh客户端工具 1.1

在执行wget  这样的操作的时候有问题。下载成功,但是显示没成功。其他目前还正常

  1. #!/usr/bin/env python
  2. # coding:utf-8
  3. import paramiko,argparse,getpass,sys,os
  4. import threading,Queue,logging
  5. from colors import light_red,light_green
  6. hostqueue=Queue.Queue()
  7. MAXTHREAD=10
  8. logging.disable(10)
  9. def logdog():
  10.     logger = logging.getLogger()
  11.     hand = logging.FileHandler(“exec.log”,’a’,’utf-8′)
  12.     formatter = logging.Formatter(‘%(asctime)s %(levelname)s %(message)s’)
  13.     hand.setFormatter(formatter)
  14.     logger.addHandler(hand)
  15.     logger.setLevel(logging.INFO)
  16.     logger.disabled
  17.     return logger,hand
  18. def funcssh(optargs,host):
  19.     connect=paramiko.SSHClient()
  20.     connect.load_system_host_keys()
  21.     connect.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  22.     if optargs[‘certificate’]:
  23.         if optargs[‘ktype’]==’rsa’:
  24.             try:
  25.                 key=paramiko.RSAKey.from_private_key_file(optargs[‘certificate’],password=optargs[‘passwd’])
  26.             except paramiko.SSHException,e:
  27.                 return host+”\t\t”+str(e)
  28.         else:
  29.             try:
  30.                 key=paramiko.DSSKey.from_private_key_file(optargs[‘certificate’],password=optargs[‘passwd’])
  31.             except paramiko.SSHException,e:
  32.                 return host+”\t\t”+str(e)
  33.         try:
  34.             connect.connect(host,optargs[‘port’],pkey=key)
  35.         except BaseException,e:
  36.             return host+”\t\t”+str(e)
  37.     else:
  38.         try:
  39.             connect.connect(host,optargs[‘port’],optargs[‘user’],optargs[‘passwd’])
  40.         except BaseException,e:
  41.             return host+str(e)
  42.     if optargs[‘command’]:
  43.         stdin,stdout,stderr=connect.exec_command(“%s” % optargs[‘command’])
  44.         s=stdout.read()
  45.         if s:
  46.             sout=’\n’+host.center(50,’#’)+’\n’+s+’EXEC COMMAD OK\n’
  47.             logger,hand=logdog()
  48.             logger.log(20, sout)
  49.             hand.flush()
  50.             logger.removeHandler(hand)
  51.             s=host.center(50,’#’)+’\n’+s+light_green(‘EXEC COMMAD OK\n’)
  52.             connect.close()
  53.             return s
  54.         e=stderr.read()
  55.         if e:
  56.             e=’\n’+host.center(50,’#’)+’\n’+e+’EXEC COMMAD Faild\n’
  57.             logging.error(e,exc_info=False)
  58.             logger,hand=logdog()
  59.             logger.log(40, e)
  60.             hand.flush()
  61.             logger.removeHandler(hand)
  62.             connect.close()
  63.             return light_red(e)
  64.         if not e and not s:
  65.             e=’\n’+host.center(50,’#’)+’\n’+’EXEC COMMAD Sucess But No resolut\n’
  66.             return e
  67.     else:
  68.         return “No Command To Exec”
  69. class pssh(threading.Thread):
  70.     global hostqueue
  71.     paramiko.util.log_to_file(‘ssh.log’)
  72.     def __init__(self,**optargs):
  73.         threading.Thread.__init__(self)
  74.         self.optargs=optargs
  75.         paramiko.util.log_to_file(‘ssh.log’)
  76.         #self.daemon=True
  77.     def run(self):
  78.         while not hostqueue.empty():
  79.             try:
  80.                 self.host=hostqueue.get_nowait()
  81.             except:
  82.                 sys.exit()
  83.             resoult=funcssh(self.optargs,self.host)
  84.             print resoult
  85.             hostqueue.task_done()
  86. class pscp(threading.Thread):
  87.     global hostqueue
  88.     paramiko.util.log_to_file(‘ssh.log’)
  89.     def __init__(self,**optargs):
  90.         threading.Thread.__init__(self)
  91.         self.optargs=optargs
  92.     def walk(self,dirs,todir):
  93.         try:
  94.             self.sftp.mkdir(todir+dirs.lstrip(self.sd))
  95.         except IOError,e:
  96.             pass
  97.         dirs=dirs.rstrip(os.sep)+os.sep
  98.         for i in os.listdir(dirs):
  99.             if os.path.isdir(dirs+i):
  100.                 print dirs+i
  101.                 self.walk(dirs+i,todir)
  102.             else:
  103.                 print dirs+i,todir+dirs.lstrip(self.sd)+i
  104.                 self.sftp.put(dirs+i,todir+dirs.lstrip(self.sd)+i)
  105.     def run(self):
  106.         #while not hostqueue.empty():
  107.         self.host=hostqueue.get()
  108.         try:
  109.             self.connect=paramiko.Transport((self.host,self.optargs[‘port’]))
  110.         except paramiko.SSHException,e:
  111.                 print e
  112.                 sys.exit()
  113.         if self.optargs[‘certificate’]:
  114.             if args.ktype==’rsa’:
  115.                 try:
  116.                     self.key=paramiko.RSAKey.from_private_key_file(self.optargs[‘certificate’],password=self.optargs[‘passwd’])
  117.                 except paramiko.SSHException,e:
  118.                     print e
  119.                     sys.exit()
  120.             else:
  121.                 try:
  122.                     self.key=paramiko.DSSKey.from_private_key_file(self.optargs[‘certificate’],password=self.optargs[‘passwd’])
  123.                 except paramiko.SSHException,e:
  124.                     print e
  125.                     sys.exit()
  126.             try:
  127.                 self.connect.connect(username=self.optargs[‘user’],pkey=self.key)
  128.             except paramiko.SSHException,e:
  129.                 print e
  130.                 sys.exit()
  131.         else:
  132.             try:
  133.                 self.connect.connect(username=self.optargs[‘user’],password=self.optargs[‘passwd’])
  134.             except paramiko.SSHException,e:
  135.                 print e
  136.                 sys.exit()
  137.         self.sftp = paramiko.SFTPClient.from_transport(self.connect)
  138.         self.sd=self.optargs[‘sdir’].rstrip(os.sep)+os.sep
  139.         self.td=self.optargs[‘ddir’].rstrip(os.sep)+os.sep
  140.         if not os.path.isdir(self.optargs[‘sdir’]):
  141.             try:
  142.                 self.sftp.put(self.optargs[‘sdir’],self.optargs[‘ddir’])
  143.             except paramiko.SSHException,e:
  144.                 print e
  145.                 sys.exit()
  146.         else:
  147.             self.walk(self.sd,self.td)
  148.         hostqueue.task_done()
  149. def getargs():
  150.     parser = argparse.ArgumentParser(description=’ssh.’,formatter_class=argparse.ArgumentDefaultsHelpFormatter,prog=’PSSH’,epilog=’Create by dennis’,usage=’%(prog)s [options]’)
  151.     parser.add_argument(‘-i’,action=’store’,metavar=’certificate’,dest=’certificate’,help=’The Certificate file’)
  152.     parser.add_argument(‘-t’,action=’store’,choices=[‘ssh’,’scp’],metavar=’ctype’,default=’ssh’,dest=’ctype’,help=”default is ssh, the value is ssh or scp “)
  153.     parser.add_argument(‘-u’,action=’store’,default=getpass.getuser(),metavar=’user’,dest=’user’,help=’The Certificate’)
  154.     parser.add_argument(‘-p’,action=’store_true’,default=False,dest=’passwd’,help=”Passwd .if use the -i option.the passwd is for the certificate”)
  155.     #parser.add_argument(‘-c’,action=’store_true’,dest=’command’,default=False,help=’Turn On Commandline Input’)
  156.     parser.add_argument(‘-c’,action=’store’,metavar=’command’,dest=’command’,help=’ Command Input’)
  157.     parser.add_argument(‘-P’,action=’store’,default=22,type=int,metavar=’port ‘,dest=’port’,help=’ssh Port .Default is 22′)
  158.     parser.add_argument(‘-sd’,action=’store’,metavar=’sdir ‘,dest=’sdir’,help=’source file/dir .’)
  159.     parser.add_argument(‘-f’,action=’store’,metavar=’filename’,dest=’filename’,help=’filename include all host .’,required=True)
  160.     parser.add_argument(‘-td’,action=’store’,metavar=’ddir ‘,dest=’ddir’,help=’dst flle/dir .’)
  161.     parser.add_argument(‘-k’,action=’store’,choices=[‘rsa’,’dsa’],metavar=’ktype’,default=’rsa’,dest=’ktype’,help=”key type .default is rsa.the value is rsa or dsa”)
  162.     parser.add_argument(‘-v’,’-version’,action=’version’ ,version=’%(prog)s 1.0′)
  163.     if len(sys.argv)==1:
  164.         parser.print_help()
  165.         sys.exit(1)
  166.     args = parser.parse_args()
  167.     return args
  168. if __name__ == ‘__main__’:
  169.     args=getargs()
  170.     ctype=args.ctype
  171.     if args.passwd:
  172.         passwd=getpass.getpass()
  173.     else:
  174.         passwd=None
  175.     try:
  176.         with open(args.filename,’r’) as f:
  177.             for i in f:
  178.                 hostqueue.put(i.strip(os.linesep))
  179.     except IOError,e:
  180.         print e
  181.         sys.exit()
  182.     if hostqueue.qsize() < MAXTHREAD:
  183.         MAXTHREAD=hostqueue.qsize()
  184.     if ctype==’ssh’:
  185.         for  i in xrange(0,MAXTHREAD):
  186.             ssh=pssh(ktype=args.ktype,command=args.command,user=args.user,passwd=passwd,certificate=args.certificate,port=args.port,filename=args.filename)
  187.             ssh.start()
  188.         ssh.join()
  189.     else:
  190.         for  i in xrange(0,MAXTHREAD):
  191.             scp=pscp(ktype=args.ktype,sdir=args.sdir,ddir=args.ddir,user=args.user,passwd=passwd,certificate=args.certificate,port=args.port,filename=args.filename)
  192.             scp.start()
  193.         scp.join()

原文http://queryer.cn/post/122/

以上是些什么东西我也不怎么懂,我只是想要有一个简单方便的ssh多线程代理客户端那ssh翻墙速度不就会更快了。

  1. 匿名
    2011年7月19日08:30

    连我要做什么都没看懂,杯具了。。。。