评论

收藏

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

开发技术 开发技术 发布于:2021-06-23 21:55 | 阅读数:289 | 评论:0

  最近在研究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 pythoncoding: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
  ......
'''
关注下面的标签,发现更多相似文章