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实现)
Dec 09 Python
详解python中的json和字典dict
Jun 22 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
Python之循环结构
Jan 15 Python
Tensorflow实现神经网络拟合线性回归
Jul 19 Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
Python-numpy实现灰度图像的分块和合并方式
Jan 09 Python
Python unittest框架操作实例解析
Apr 13 Python
python简单实现9宫格图片实例
Sep 03 Python
python小型的音频操作库mp3Play
Apr 24 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
Apr 28 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如何解决网站大流量与高并发的问题
2011/06/25 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
2016/04/01 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
超详细的JS弹出窗口代码大全
2020/04/18 Javascript
JS前端加密算法示例
2016/12/22 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
2019/01/30 Python
python常用数据重复项处理方法
2019/11/22 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
Python小白垃圾回收机制入门
2020/06/09 Python
python三引号如何输入
2020/07/06 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
HTML5 Canvas概述
2009/08/26 HTML / CSS
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
Internet体系结构
2014/12/21 面试题
机关单位动员会主持词
2014/03/20 职场文书
无犯罪记录证明
2014/09/19 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android