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

程序执行时需要读取两个文件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)

时间: 2024-11-05 12:25:35

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

python下paramiko模块实现ssh连接登录Linux服务器

  本文实例讲述了python下paramiko模块实现ssh连接登录Linux服务器的方法.分享给大家供大家参考.具体分析如下: python下有个paramiko模块,这个模块可以实现ssh登录linux服务器,下面贴出代码,注意,我在centos5.6下,python2.6.5,paramiko-1.7的版本下测试成功. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env python import paramiko hostname='17

Windows下使用xShell向远程Linux上传文件

上传文件使用rz与sz命令,远程Linux系统上需要安装lrzsz工具包 下载安装包lrzsz-0.12.20.tar.gz:  http://www.linuxidc.com/Linux/2010-08/27739.htm 安装如下: [Linuxidc@Linuxidc /]# yum install lrzsz 注意:我使用的命令是yum,如果你的是其他的请在网上查找相关的资料,只要install 后面加上 lrzsz都可以,单独的rz或sz是不行的 上传文件执行命令如下 [Linuxid

python使用paramiko模块ssh连接远程主机,环境变量问题

问题描述 python使用paramiko模块ssh连接远程主机,环境变量问题 想写个脚本去远程维护主机,执行相应命令,但是通过python使用paramiko模块ssh连接远程主机,环境变量不跟随用户,通过export环境变量也不起作用, #!/usr/bin/python import paramiko,fileinput ssh=paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) fo

python中paramiko模块问题。

问题描述 python中paramiko模块问题. 使用paramiko模块远程连接Linux主机,报错socket.error: [Errno 10061] 具体如图 困扰了小弟几周仍无法解决,求各位大神指点迷津! 解决方案 paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能.这是一个第三方的软件包,使用之前需要安装.1 基于用户名和密码的 sshclient 方式登录# 建立一个sshclient对象 ssh = paramiko.SSHClient()

python中paramiko模块入门 三:上传批量文件到远程主机

今天我继续给大家介绍paramiko这个模块的其他功能,主要介绍利用paramiko来上传文件到远程主机,呵呵,其实就是paramiko模块中put方法的介绍,下面不废话,直接上代码,大家感兴趣,可以看下: [root@centos6 python]# clear [root@centos6 python]# cat paramiko-upload.py #!/usr/bin/env python import paramiko import os import datetime hostnam

python中paramiko模块入门 二:利用配置文件登录批量主机

之前我写过一篇关于python中paramiko模块简单功能的文章,今天继续给大家介绍这个模块的一些用法. 今天主要是利用python读取配置文件来登录批量主机,并在主机上执行shell命令,废话不说了,直接上代码了,大家可以看看: #!/usr/bin/env python import paramiko import os import datetime from ConfigParser import ConfigParser ConfigFile='config.ini' config=

selenium-webdriver(python) (九) 上传文件

本节重点: 上传文件 文件上传操作也比较常见功能之一,上传功能没有用到新有方法或函数,关键是思路. 上传过程一般要打开一个本地窗口,从窗口选择本地文件添加.所以,一般会卡在如何操作本地窗口添加上传文件. 其实,在selenium webdriver没我们想的那么复杂:只要定位上传按钮,通send_keys添加本地文件路径就可以了.绝对路径和相对路径都可以,关键是上传的文件存在.下面通地例子演示. upload_file.html <html> <head> <meta htt

C# 用RDP协议远程连接,怎么上传文件呀!

问题描述 现在已经可以用rdp来登陆了!使用的以上控件实现,AxMsRdpClient9NotSafeForScripting问题:是否有办法在连接并登陆后,自动上传某个文件呢(或上传执行)?正常情况用远程连接,只要映射了本地磁盘都可以手动上传文件,现在想看看有自动上传的办法么?不限手段.之前也想到过登陆后,自动用带参数方式运行IE,下载需要的文件,但是这样不足的地方在于还是需要手动去点保存运行等..求大神支招... 解决方案

在附件管理模块中增加对FTP 上传和预览的支持

在之前介绍的附件管理模块里面<Winform开发框架之通用附件管理模块>以及<Winform开发框架之附件管理应用>,介绍了附件的管理功能,通过对数据库记录的处理和文件的管理,实现了附件文件和记录的整合管理,可以运用在单机版的WInform框架,也可以使用在分布式的混合式开发框架中,随着一些开发场景的丰富,我们需要以FTP方式上传文件,因此对这个附件管理模块进行扩展,以便适合更多的实际项目需求. 1.FTP上传.HTTP文件预览实现思路 我们设想的附件管理,底层都是需要在Winfo