多线程ssh工具
多线程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 这样的操作的时候有问题。下载成功,但是显示没成功。其他目前还正常
- #!/usr/bin/env python
- # coding:utf-8
- import paramiko,argparse,getpass,sys,os
- import threading,Queue,logging
- from colors import light_red,light_green
- hostqueue=Queue.Queue()
- MAXTHREAD=10
- logging.disable(10)
- def logdog():
- logger = logging.getLogger()
- hand = logging.FileHandler(“exec.log”,’a’,’utf-8′)
- formatter = logging.Formatter(‘%(asctime)s %(levelname)s %(message)s’)
- hand.setFormatter(formatter)
- logger.addHandler(hand)
- logger.setLevel(logging.INFO)
- logger.disabled
- return logger,hand
- def funcssh(optargs,host):
- connect=paramiko.SSHClient()
- connect.load_system_host_keys()
- connect.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- if optargs[‘certificate’]:
- if optargs[‘ktype’]==’rsa’:
- try:
- key=paramiko.RSAKey.from_private_key_file(optargs[‘certificate’],password=optargs[‘passwd’])
- except paramiko.SSHException,e:
- return host+”\t\t”+str(e)
- else:
- try:
- key=paramiko.DSSKey.from_private_key_file(optargs[‘certificate’],password=optargs[‘passwd’])
- except paramiko.SSHException,e:
- return host+”\t\t”+str(e)
- try:
- connect.connect(host,optargs[‘port’],pkey=key)
- except BaseException,e:
- return host+”\t\t”+str(e)
- else:
- try:
- connect.connect(host,optargs[‘port’],optargs[‘user’],optargs[‘passwd’])
- except BaseException,e:
- return host+str(e)
- if optargs[‘command’]:
- stdin,stdout,stderr=connect.exec_command(“%s” % optargs[‘command’])
- s=stdout.read()
- if s:
- sout=’\n’+host.center(50,’#’)+’\n’+s+’EXEC COMMAD OK\n’
- logger,hand=logdog()
- logger.log(20, sout)
- hand.flush()
- logger.removeHandler(hand)
- s=host.center(50,’#’)+’\n’+s+light_green(‘EXEC COMMAD OK\n’)
- connect.close()
- return s
- e=stderr.read()
- if e:
- e=’\n’+host.center(50,’#’)+’\n’+e+’EXEC COMMAD Faild\n’
- logging.error(e,exc_info=False)
- logger,hand=logdog()
- logger.log(40, e)
- hand.flush()
- logger.removeHandler(hand)
- connect.close()
- return light_red(e)
- if not e and not s:
- e=’\n’+host.center(50,’#’)+’\n’+’EXEC COMMAD Sucess But No resolut\n’
- return e
- else:
- return “No Command To Exec”
- class pssh(threading.Thread):
- global hostqueue
- paramiko.util.log_to_file(‘ssh.log’)
- def __init__(self,**optargs):
- threading.Thread.__init__(self)
- self.optargs=optargs
- paramiko.util.log_to_file(‘ssh.log’)
- #self.daemon=True
- def run(self):
- while not hostqueue.empty():
- try:
- self.host=hostqueue.get_nowait()
- except:
- sys.exit()
- resoult=funcssh(self.optargs,self.host)
- print resoult
- hostqueue.task_done()
- class pscp(threading.Thread):
- global hostqueue
- paramiko.util.log_to_file(‘ssh.log’)
- def __init__(self,**optargs):
- threading.Thread.__init__(self)
- self.optargs=optargs
- def walk(self,dirs,todir):
- try:
- self.sftp.mkdir(todir+dirs.lstrip(self.sd))
- except IOError,e:
- pass
- dirs=dirs.rstrip(os.sep)+os.sep
- for i in os.listdir(dirs):
- if os.path.isdir(dirs+i):
- print dirs+i
- self.walk(dirs+i,todir)
- else:
- print dirs+i,todir+dirs.lstrip(self.sd)+i
- self.sftp.put(dirs+i,todir+dirs.lstrip(self.sd)+i)
- def run(self):
- #while not hostqueue.empty():
- self.host=hostqueue.get()
- try:
- self.connect=paramiko.Transport((self.host,self.optargs[‘port’]))
- except paramiko.SSHException,e:
- print e
- sys.exit()
- if self.optargs[‘certificate’]:
- if args.ktype==’rsa’:
- try:
- self.key=paramiko.RSAKey.from_private_key_file(self.optargs[‘certificate’],password=self.optargs[‘passwd’])
- except paramiko.SSHException,e:
- print e
- sys.exit()
- else:
- try:
- self.key=paramiko.DSSKey.from_private_key_file(self.optargs[‘certificate’],password=self.optargs[‘passwd’])
- except paramiko.SSHException,e:
- print e
- sys.exit()
- try:
- self.connect.connect(username=self.optargs[‘user’],pkey=self.key)
- except paramiko.SSHException,e:
- print e
- sys.exit()
- else:
- try:
- self.connect.connect(username=self.optargs[‘user’],password=self.optargs[‘passwd’])
- except paramiko.SSHException,e:
- print e
- sys.exit()
- self.sftp = paramiko.SFTPClient.from_transport(self.connect)
- self.sd=self.optargs[‘sdir’].rstrip(os.sep)+os.sep
- self.td=self.optargs[‘ddir’].rstrip(os.sep)+os.sep
- if not os.path.isdir(self.optargs[‘sdir’]):
- try:
- self.sftp.put(self.optargs[‘sdir’],self.optargs[‘ddir’])
- except paramiko.SSHException,e:
- print e
- sys.exit()
- else:
- self.walk(self.sd,self.td)
- hostqueue.task_done()
- def getargs():
- parser = argparse.ArgumentParser(description=’ssh.’,formatter_class=argparse.ArgumentDefaultsHelpFormatter,prog=’PSSH’,epilog=’Create by dennis’,usage=’%(prog)s [options]’)
- parser.add_argument(‘-i’,action=’store’,metavar=’certificate’,dest=’certificate’,help=’The Certificate file’)
- 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 “)
- parser.add_argument(‘-u’,action=’store’,default=getpass.getuser(),metavar=’user’,dest=’user’,help=’The Certificate’)
- parser.add_argument(‘-p’,action=’store_true’,default=False,dest=’passwd’,help=”Passwd .if use the -i option.the passwd is for the certificate”)
- #parser.add_argument(‘-c’,action=’store_true’,dest=’command’,default=False,help=’Turn On Commandline Input’)
- parser.add_argument(‘-c’,action=’store’,metavar=’command’,dest=’command’,help=’ Command Input’)
- parser.add_argument(‘-P’,action=’store’,default=22,type=int,metavar=’port ‘,dest=’port’,help=’ssh Port .Default is 22′)
- parser.add_argument(‘-sd’,action=’store’,metavar=’sdir ‘,dest=’sdir’,help=’source file/dir .’)
- parser.add_argument(‘-f’,action=’store’,metavar=’filename’,dest=’filename’,help=’filename include all host .’,required=True)
- parser.add_argument(‘-td’,action=’store’,metavar=’ddir ‘,dest=’ddir’,help=’dst flle/dir .’)
- 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”)
- parser.add_argument(‘-v’,’-version’,action=’version’ ,version=’%(prog)s 1.0′)
- if len(sys.argv)==1:
- parser.print_help()
- sys.exit(1)
- args = parser.parse_args()
- return args
- if __name__ == ‘__main__’:
- args=getargs()
- ctype=args.ctype
- if args.passwd:
- passwd=getpass.getpass()
- else:
- passwd=None
- try:
- with open(args.filename,’r’) as f:
- for i in f:
- hostqueue.put(i.strip(os.linesep))
- except IOError,e:
- print e
- sys.exit()
- if hostqueue.qsize() < MAXTHREAD:
- MAXTHREAD=hostqueue.qsize()
- if ctype==’ssh’:
- for i in xrange(0,MAXTHREAD):
- ssh=pssh(ktype=args.ktype,command=args.command,user=args.user,passwd=passwd,certificate=args.certificate,port=args.port,filename=args.filename)
- ssh.start()
- ssh.join()
- else:
- for i in xrange(0,MAXTHREAD):
- 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)
- scp.start()
- scp.join()
原文:http://queryer.cn/post/122/
以上是些什么东西我也不怎么懂,我只是想要有一个简单方便的ssh多线程代理客户端那ssh翻墙速度不就会更快了。
连我要做什么都没看懂,杯具了。。。。