python使用paramiko模块实现ssh远程登陆上传文件并执行


Posted in Python onJanuary 27, 2014

程序执行时需要读取两个文件command.txt和ipandpass.txt。格式如下:

command.txt:
ThreadNum:1
port:22
local_dir:hello_mkdir
remote_dir:hello_mkdir
alter_auth:chmod 755 hello_mkdir
exec_program:./hello_mkdir
ipandpass.txt:
ip username password

程序中的队列操作是修改的别的程序,写的确实不错。
该程序亦正亦邪,如果拿去做坏事,我先声明与我无关,我只是分享我的代码罢了。
希望有兴趣的同志们来讨论技术应用。
这其中用到了paramiko,队列,多线程,后续也会写一些这三个方面的东西。欢迎批评指正。
其实这个程序有些地方还有待优化。

#function:upload files through ssh protocal and excute the files 
#lib:paramiko
#MyThread:init a thread to run the function
#ThreadPol:init a thread pool
#uploadAndExecu:upload file and excute
#readConf:read config file
#-*- coding = utf-8 -*-

import Queue
import sys
import threading
import paramiko
import socket
from threading import Thread
import time
class MyThread(Thread):
    def __init__(self, workQueue, timeout=1):
        Thread.__init__(self)
        self.timeout = timeout
        self.setDaemon(False)
        self.workQueue = workQueue
        self.start()
        #print 'i am runnning ...'
    def run(self):
        emptyQueue = 0
        while True:
            try:
                callable, username, password, ipAddress, port,comms = self.workQueue.get(timeout = self.timeout)
                #print 'attacking :',ipAddress,username,password,threading.currentThread().getName(),' time : '
                callable(username,password, ipAddress, port,comms)
            except Queue.Empty:
                print threading.currentThread().getName(),":queue is empty ; sleep 5 seconds\n"
                emptyQueue += 1
                #judge the queue,if it is empty or not.
                time.sleep(5)
                if emptyQueue == 5:
                    print threading.currentThread().getName(),'i  quit,the queue is empty'
                    break
            except Exception, error:
                print error
class ThreadPool:
    def __init__(self, num_of_threads=10):
        self.workQueue = Queue.Queue()
        self.threads = []
        self.__createThreadPool(num_of_threads)
    #create the threads pool
    def __createThreadPool(self, num_of_threads):
        for i in range(num_of_threads):
            thread = MyThread(self.workQueue)
            self.threads.append(thread)
    def wait_for_complete(self):
        #print len(self.threads)
        while len(self.threads):
            thread = self.threads.pop()
            if thread.isAlive():
                thread.join()
    def add_job(self, callable, username, password, ipAddress, Port,comms):
        self.workQueue.put((callable, username, password, ipAddress, Port,comms))
def uploadAndExecu(usernam,password,hostname,port,comm):
    print usernam,password,hostname,port,comm
    try:
        t = paramiko.Transport((hostname,int(port)))
        t.connect(username=username,password=password)
        sftp=paramiko.SFTPClient.from_transport(t)
        sftp.put(comm['local_dir'],comm['remote_dir'])
    except Exception,e:
        print 'upload files failed:',e
        t.close()
    finally:
        t.close()
    
    try:
        ssh = paramiko.SSHClient()
        ssh.load_system_host_keys()
        ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy())
        ssh.connect(hostname, port=int(port), username=username, password=password)
        ssh.exec_command(comm['alter_auth'])
        ssh.exec_command(comm['exec_program'])
    except Exception,e:
        print 'chang file auth or execute the file failed:',e
    ssh.close()
    
def readConf():
    comm={}
    try:
        f = file('command.txt','r')
        for l in f:
            sp = l.split(':')
            comm[sp[0]]=sp[1].strip('\n')
    except Exception,e:
        print 'open file command.txt failed:',e
    f.close()
    return comm
if __name__ == "__main__":
    commandLine = readConf()
    print commandLine 
    #prepare the ips
    wm = ThreadPool(int(commandLine['ThreadNum']))
    try:
        ipFile = file('ipandpass.txt','r')
    except:
        print "[-] ip.txt Open file Failed!"
        sys.exit(1)
    for line in ipFile:
        IpAdd,username,pwd = line.strip('\r\n').split(' ')
        wm.add_job(uploadAndExecu,username,pwd,IpAdd,commandLine['port'],commandLine)
Python 相关文章推荐
python 查找文件夹下所有文件 实现代码
Jul 01 Python
python代码制作configure文件示例
Jul 28 Python
常用python编程模板汇总
Feb 12 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
numpy.transpose对三维数组的转置方法
Apr 17 Python
python实现汉诺塔算法
Mar 01 Python
对python requests的content和text方法的区别详解
Oct 11 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
python判断元素是否存在的实例方法
Sep 24 Python
python 安全地删除列表元素的方法
Mar 16 Python
python list使用示例 list中找连续的数字
Jan 27 #Python
Python批量修改文件后缀的方法
Jan 26 #Python
使用cx_freeze把python打包exe示例
Jan 24 #Python
Python的函数嵌套的使用方法
Jan 24 #Python
下载安装setuptool和pip linux安装pip    
Jan 24 #Python
python解析文件示例
Jan 23 #Python
python回调函数的使用方法
Jan 23 #Python
You might like
如何把PHP转成EXE文件
2006/10/09 PHP
php&java(三)
2006/10/09 PHP
PHP中for循环语句的几种变型
2007/03/16 PHP
php 获取远程网页内容的函数
2009/09/08 PHP
关于zend studio 出现乱码问题的总结
2013/06/23 PHP
PHP加密解密实例分析
2015/12/25 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
老生常谈PHP数组函数array_merge(必看篇)
2017/05/25 PHP
js静态作用域的功能。
2006/12/25 Javascript
JavaScript delete操作符应用实例
2009/01/13 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
js/jquery解析json和数组格式的方法详解
2014/01/09 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
用Python的urllib库提交WEB表单
2009/02/24 Python
用python 制作图片转pdf工具
2015/01/30 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
html5读取本地文件示例代码
2014/04/22 HTML / CSS
毕业生简单求职信
2013/11/19 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
运动会方阵口号
2014/06/07 职场文书
领导班子对照检查材料
2014/09/22 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
python中subplot大小的设置步骤
2021/06/28 Python
Python pandas求方差和标准差的方法实例
2021/08/04 Python
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫