最近在研究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)
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博客,原文链接:http://blog.51cto.com/crazy123/1691367