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


 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/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)
     =  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  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  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
    ......
    '''