专栏首页python3python多线程paramiko

python多线程paramiko

初学python,网上找发些关于paramiko实现python多线程的功能,发现相互抄袭占多.别人的总归是别人的,也同时为了练习技术,就自己写了一个基于paramiko免密认证多线程并发脚本.与大家共勉.使用上的问题的同学也可以联系我.刚开始写基本上是纯shell脚本的思维方式.有经验的同学也欢迎指点一二

#脚本功能简介

1. 同时支持文件传输和命令执行功能 2. 部分代码增加异常判断功能 3. 支持空行和#注释功能 4. 支持多并发执行

#缺陷

1. 输出无颜色标识 2. 无执行结果汇总功能 3. 远程执行的部分命令需加绝对路径(有经验的同学指点下) 4. 用map实现的多线程,非多进程

!!!NOTE!!!

脚本没有线上应用经历,没有经过严格压测,纯属学习功用,使用前请通读自定义修改,如带来运营上损失,与作者无关,

#command内容

file:::/home/linuxlst/pylear/paramiko/sftp/sftp_v2.py /home/linuxlst/sftp_v2.py put
com:::ls /home/linuxlst/sftp_v2.py /home/linuxlst/datafile/songtaoli/paramiko_mabs4.txt
com:::/sbin/ifconfig > /home/linuxlst/ifconfig.log

#com:::/sbin/ifconfig > /home/linuxlst/ifconfig.log

#iplist内容

192.168.37.142 linuxlst redhat 22
192.168.37.144 linuxlst redhat 22
#192.168.37.144 linuxlst redhat 22

#代码内容

#!/bin/env  python
#function: upload files throuth ssh protocal and excute command
#-*- conding = utf-8 -*-

import paramiko
import sys
import threading
import os
import re
from multiprocessing.dummy import Pool as ThreadPool
from time import sleep,ctime


MULTI_PROC = 2  #process
pool = ThreadPool(MULTI_PROC)

def Usage():
    print '*' * 50
    print '''
Usage: 
     mabs.py command iplist

*****cat command*****
com:::ls /home/linuxlst/datafile/songtaoli/
file:::/home/linuxlst/pylear/paramiko/sftp/sftp_v2.py /home/linuxlst/sftp_v2.py put

*****cat iplist*****
192.168.37.142 linuxlst redhat 22
    '''
    print '*' * 50

def FileUsage():
    print "Usage:"
    print "    file:::/home/linuxlst/pylear/paramiko/sftp/sftp_v2.py /home/linuxlst/sftp_v2.py put"


def FileTran(comm,TranType,hostname,username,pwd,port):
    try:
        #print 'hostname:',hostname
        #print 'port:',port
        t = paramiko.Transport((hostname,int(port)))
        t.connect(username=username,password=pwd)
        sftp = paramiko.SFTPClient.from_transport(t)
        filetran = comm.split(' ')
        local = filetran[0].strip('\n')
        remote = filetran[1].strip('\n')
        if TranType == "put":
            #print '***put file %s to remote %s' % (local,remote)
            sftp.put(local,remote)
        elif TranType == "get":
            #print '***get remote file %s to local %s' % (remote,local)
            sftp.get(remote,local)
        else:
            print "ERROR:lack of tran TranType."
            sys.exit()
        t.close()
    except Exception, e:
        traceback.print_exc()
        try:
            t.close()
        except:
            pass
 
def Execu(hostname,username,pwd,port,command):
    try:
        #print '***Run command {%s} on host {%s} by username {%s}' % (command,hostname,username)
        ssh = paramiko.SSHClient()
        ssh.load_system_host_keys()
        #ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy())
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname,port=int(port),username=username,password=pwd)
        stdin,stdout,stderr = ssh.exec_command(command)
        #stdin,stdout,stderr = ssh.exec_command('hostname')
        #print stdin.read()
        print stdout.read()
        print stderr.read()
    except Exception,e:
        print 'change file auth or excute file failed:',e
    ssh.close()

def main(config):
    ip = config[0]
    username = config[1]
    pwd = config[2]
    port = config[3]
    comm = config[4]
    print ip,username,pwd,port,comm
    maincomm = [] 
    TranType = ''
    sp = comm.split(':::')
    if sp[0] == "com":
        #maincomm = [sp[1].strip('\n'),'com']
        commandline = sp[1].strip('\n')
        Execu(ip,username,pwd,port,commandline)  
    elif sp[0] == "file":
        m = sp[1].strip('\n')
        if re.search('put',m):
            TranType = 'put'
            #maincomm = [sp[1].strip('\n'),TranType]
            commandline = sp[1].strip('\n')
            FileTran(commandline,TranType,ip,username,pwd,port)
        elif re.search('get',m):
            TranType = 'get'
            #maincomm = [sp[1].strip('\n'),TranType]
            commandline = sp[1].strip('\n')
            FileTran(commandline,TranType,ip,username,pwd,port)
        else:
            print 'ERROR:lack of tran TranType'
            FileUsage()
            sys.exit()
    else:
        print 'ERROR:lack com or file mark'
        FileUsage()
        sys.exit()   


def MyMul():
    threads = []
    com = open(sys.argv[1],'r')  #command file
    confs  = open(sys.argv[2],'r')  #config file
    confs.seek(0)
    config = []
    for conf in confs:
        com.seek(0)
        #print ip,username,port
        if not conf.startswith('#') and len(conf) > 1:
            ip,username,pwd,port = conf.strip('\r\n').split(' ')
            #lconf += 1
            for comm in com:
                if not comm.startswith('#') and len(comm) > 1:
                    config.append([ip,username,pwd,port,comm])

    pool.map(main,config)
    pool.close()
    pool.join()

if len(sys.argv) != 3:
    Usage()
    os.sys.exit()

if __name__ == '__main__':
    MyMul()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python3 猜数字小游戏2.0

    #!/usr/bin/python print ( "----------这是一个猜数游戏----------" ) temp = input( "请输入一个...

    py3study
  • python之多进程

    python中的多线程无法利用多核优势,如果想要充分地使用多核cpu的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。pyt...

    py3study
  • python下载图片

    在diveintopython网站上,http://diveintopython.org/html_processing/extracting_data.htm...

    py3study
  • 基于Anaconda实现网络安装

    anaconda是RedHat、CentOS、Fedora等Linux发行版的安装管理程序。它可以提供文本、图形等安装管理方式,并支持Kickstart等脚本提...

    用户1456517
  • python购物小票的案例

    ''' 数据: T恤 tshirt 245元 运动鞋 sport 370元 网球拍 tennis 345.5元 指令: 输入:T恤 tshirt 245元 运动...

    py3study
  • AI 在 marketing 上的应用

    杨熹
  • 设计模式(1)-单例模式

    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。

    秦子帅
  • 吴章金: 实例解析 Linux C 语言程序之变量类型

    "本文从编译、二进制程序文件和运行角度逐级解析了 Linux C 语言程序中几种变量类型"

    Linux阅码场
  • 写了这么久代码,你懂单例模式吗?

    这种方式在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。这种方式基于类加载机制避免了多线程的同步问题,但是也不能确定有其他的方式(或者其他的静态方...

    咻咻ing
  • 设计模式二十四章经之单例设计模式

    我就是马云飞

扫码关注云+社区

领取腾讯云代金券