SFTP基于Key多进程批量并发上传文件实现案例(python)

最近在研究Paramiko,Paramiko可以非常方便的实现基于SSH协议的远程连接,可以基于

口令,也可以无口令RSA非对称密钥,亦可以实现SFTP上传下载操作,安全高效,再结合多

进程或者是多线程就可以实现并行处理,写了一个简单的SFTP基于Key多进程批量并发上传

文件的实现案例,供以后参考。

安装加密模块和Paramiko模块

  下载:pycrypto-2.6.1.tar.gz

     paramiko-1.10.1.tar.gz

  安装:

     tar -zxf pycrypto-2.6.1.tar.gz

     python setup.py build

     python setup.py install

基于RSA非对称密码(公钥和私钥),需要在服务端创建密钥,并将公钥分发到客户端

创建RSA密钥对:ssh-keygen -t rsa

将私钥拷贝到客户端:ssh-copy-id  [email protected]

代码如下:

#!/usr/bin/env python
#coding:utf-8

import paramiko,sys,os
from multiprocessing import Pool

def sftp_put(IP,Port,User,Locdir,Rmtdir):
    pravie_key_path = ‘/root/.ssh/id_rsa‘
    key = paramiko.RSAKey.from_private_key_file(pravie_key_path)
    t = paramiko.Transport((IP,Port))
    t.connect(username=User,pkey=key)
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.put(Locdir, Rmtdir)   
    t.close()

def read_file():
    global list
    list=[]
    with open(‘userinfo.txt‘,‘rb‘) as f:
        for line in f:
            list.append(line)

def print_ip():
    global dic
    dic={}
    for i in range(len(list)):
        lip=list[i].split()[0]
        dic[i]=list[i]
        print ‘【%d】  %s‘%(i,lip)
    
def judge():
    global IPList
    IPList=[]
    while True:
        inp=raw_input(‘\033[34;1m请输入序号选择需要上传的主机,输入ok执行:\033[0m‘).strip()
        if inp.isdigit() and int(inp) in dic.keys():
            IPList.append(int(inp))
        elif inp == ‘ok‘:
            create_process()
            break
        elif inp == ‘exit‘:
            sys.exit()
        else:
            print ‘\033[31;1m输入错误,请重新输入\033[0m‘
                   
def create_process():
    pool=Pool(processes=4)
    IPListyz=tuple(set(IPList))
    while True:    
        Locdir=raw_input(‘请输入本地文件路径:‘)
        if os.path.exists(Locdir):
            break
        else:
            print ‘\033[33;1m本地文件不存在,请重新输入!\033[0m‘
    Rmtdir=raw_input(‘\033[34;1m请输入远程文件路径:\033[0m‘)
    print ‘\033[33;1m已选择主机如下:\033[0m‘
    for i in IPListyz:
        IP=dic[i].split()[0]
        Port=dic[i].split()[1]
        User=dic[i].split()[2]
        print IP
        pool.apply_async(sftp_put,(IP,int(Port),User,Locdir,Rmtdir,))
    pool.close()
    pool.join()
    
if __name__ == ‘__main__‘:
    read_file()
    print_ip()
    judge()
    print ‘\033[33;1m上传成功\033[0m‘
    
   ‘‘‘
   注意:脚本通过文本的方式来获得主机的IP地址,端口和用户名信息,格式如下:
   192.168.2.100 22  root
   192.168.2.100 1625  zkyw
   ......
   ‘‘‘
时间: 2024-12-10 22:55:29

SFTP基于Key多进程批量并发上传文件实现案例(python)的相关文章

ajax上传文件 基于jquery form表单上传文件

<script src="/static/js/jquery.js"></script><script> $("#reg-btn").click(function () { // 1. 取到用户填写的数据 var form_data_obj = new FormData(); form_data_obj.append('username',$('#id_username').val()); form_data_obj.append

使用七牛云存储上传文件学习案例

最近学习了使用七牛云储存上传文件的经验过程,和大家分享一下.语言:C# 七牛云储存用户注册地址:https://portal.qiniu.com/signup?code=3lciek5byj2oi 起初看七牛云储存官方的开发文档,按照上面的说的进行配置的过程中,遇到了2个问题,一个是公司网络的问题(泪奔,网管拒绝了对七牛等云储存应用的上传的请求).另一个是开发文档中配置提示不够完善,也许是鄙人没有找到. 开发文档URL:http://developer.qiniu.com/docs/v6/sdk

使用shell并发上传文件到hdfs

    最初业务需求:将文件从ftp下到本地并上传到hdfs,其中ftp到本地和本地到hdfs皆有文件完整性校验,ftp到本地的逻辑由于和业务耦合度较高,因此本文不再叙述,这里仅说一下从本地到hdfs的并发脚本相关说明及代码实现. 测试环境: RHEL6.4 x86_64 / Hadoop 2.4.0.2.1.5.0-695 部分需求说明: 1.需要提供一个文件列表,以文件的形式,每行一个文件,所有文件有一个共同的父目录,且文件是有效存在的,当然,不存在脚本也会判断并记录的. 2.需要提供一个h

Android网络编程之使用HttpClient和MultipartEntityBuilder 批量同时上传文件和文字

/** by keinta in China sz  email: [email protected]  2016.10.18 CN: 此JAR包里面已经集成了android http 网络请求包,也封装了 MultipartEntityBuilder 文件与文字同时上传,实现向下兼容   你只需要添加这两个包就可以实现android 的多类型网络传输了    Please add the  packages :      compile files('libs/org.apache.http.

利用paramiko模块批量登录(执行命令/上传文件)

工作中由于服务器主机很多,如果手动的一台一台去添加ssh认证,效率太低了,而此脚本正是为了解决此问题 此脚本的实现的功能: 1.实现了(密码.ssh认证)单一主机登录和批量主机登录 2.实现了(密码.ssh认证)单一主机上传文件和批量主机上传文件(下载文件的原理和此一样) 3.主机批量添加ssh认证(这才是我的主要目的) 脚本的不足: 1.只能循环主机名 2.所有的主机的账号和密码都是一样的,不够灵活 有需求的朋友可以修改下代码,可以把主机.账号密码存放在一个文件中,循环读取文件 下面贴上代码吧

PHP 批量上传文件 大全

PHP  批量上传文件 大全 案例一: <?php $file_path="uploads/"; for($i=0;$i<count($_FILES[ufile][name]);$i++){ $_FILES[ufile][name][$i]=time().$_FILES[ufile][name][$i]; //加个时间戳防止重复文件上传后被覆盖     } print_r($_FILES[ufile][name]); $filename=$_FILES[ufile][nam

Flash上传文件(结合asp.net)

一.实现原理.在某些场合,我们需要使用Flash进行“文件上传”,原因是Flash 能制作出表现力丰富的UI界面. (自负又孤陋寡闻的我在这里做一个补充:Flash使用flash.net包中的FileReference是可以发送文件数据到一个asp,asp.net或php页的,可以看浪子的[Flash FileUpload]用flash.net.FileReference实现ASP.NET无刷新文件上传,codeproject有这样的示例:Multiple File Upload With Pr

基于element ui 实现七牛云自定义key上传文件,并监听更新上传进度

借助上传Upload 上传组件的 http-request 覆盖默认的上传行为,可以自定义上传的实现 <el-upload multiple ref="sliderUpload" :data="uploadData" :action="uploadData.url" list-type="picture-card" accept="image/png,image/jpeg,image/jpg" :au

android批量文件上传(android批量图片上传)

项目中多处用到文件批量上传功能,今天正好解决了此问题,在此写出来,以便日后借鉴. 首先,以下架构下的批量文件上传可能会失败或者不会成功: 1.android客户端+springMVC服务端:服务端采用org.springframework.web.multipart.MultipartHttpServletRequest作为批量上传接收类,这种搭配下的批量文件上传会失败,最终服务端只会接受到一个文件,即只会接受到第一个文件.可能因为MultipartHttpServletRequest对serv