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抓taobao图片爬虫
Oct 26 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
Django restframework 源码分析之认证详解
Feb 22 Python
python实现移位加密和解密
Mar 22 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
Python实现随机生成任意数量车牌号
Jan 21 Python
python数据预处理方式 :数据降维
Feb 24 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
keras 模型参数,模型保存,中间结果输出操作
Jul 06 Python
python如何绘制疫情图
Sep 16 Python
详解Java中一维、二维数组在内存中的结构
Feb 11 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统一页面编码避免乱码问题
2015/04/09 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
PHP守护进程实例
2015/03/06 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
详解Python中heapq模块的用法
2016/06/28 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
python实现图片横向和纵向拼接
2020/03/05 Python
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
CHARLES & KEITH台湾官网:新加坡时尚品牌
2019/07/30 全球购物
陈安之励志演讲稿
2014/08/21 职场文书
悬空寺导游词
2015/02/05 职场文书
商场营业员岗位职责
2015/04/14 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
微观世界观后感
2015/06/10 职场文书