为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
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  root@192.168.3.181

 代码如下:

#!/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

   ......

   '''

©著作权归作者所有:来自51CTO博客作者清风拂面的原创作品,如需转载,请注明出处,否则将追究法律责任

客户端多线程python脚本


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消