最近在研究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 ...... '''