主要用途,从本机获取远端机器的文件夹
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
|
#!/usr/bin/python import pexpect
import paramiko
import os
import sys
import time
import multiprocessing
import datetime
import crash_on_ipy
from stat import S_ISDIR
ip_list = []
#room_id = sys.argv[1] cur_time = datetime.datetime.now()
class get_thread():
def __init__( self ,host_ip = 'ip' ):
self .host_ip = 'ip'
self .scp = paramiko.SSHClient()
self .scp.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self .scp = paramiko.Transport((host_ip, 22 ))
self .scp.connect(username = 'tomcat' , password = 'xx' )
self .sftp = paramiko.SFTPClient.from_transport( self .scp)
def _walk_remote( self , dirpath):
dirnames = []
filenames = []
for fd in self .sftp.listdir_attr(dirpath):
if S_ISDIR(fd.st_mode):
dirnames.append(fd.filename)
else :
filenames.append(fd.filename)
yield dirpath, dirnames, filenames
for dirname in dirnames:
new_dirpath = os.path.join(dirpath, dirname)
# yield from self._walk_remote(new_dirpath)
for walk in self ._walk_remote(new_dirpath):
yield walk
def getall( self ,local,remote):
st_mode = self .sftp.stat(remote).st_mode
if not S_ISDIR(st_mode):
filename = os.path.basename(remote)
self .sftp.get(remote, os.path.join(local, filename))
else :
parent, child = os.path.split(remote)
for dirpath, dirnames, filenames in self ._walk_remote(remote):
dirpath = dirpath.replace(parent, '.' )
for dirname in dirnames:
try :
os.makedirs(os.path.join(local, dirpath, dirname))
except :
pass
for filename in filenames:
localpath = os.path.join(local, dirpath, filename)
remotepath = os.path.join(parent, dirpath, filename)
self .sftp.get(remotepath, localpath)
self .scp.close()
if __name__ = = '__main__' :
print "-" * 50
getthread = get_thread()
room_pathd = '/opt/src/logs/'
room_paths = '/home/python/'
getthread.getall(room_paths,room_pathd)
|
因为想作为类,然后读取文件,批量传输 改进版
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
78
79
80
81
82
83
84
|
#!/usr/bin/python import pexpect
import paramiko
import os
import sys
import time
import multiprocessing
import datetime
import crash_on_ipy
from stat import S_ISDIR
ip_list = []
#room_id = sys.argv[1] cur_time = datetime.datetime.now()
class get_thread():
def __init__( self ,hostname,password,username,port = None ):
#def __init__(self,hostname,username='root',key_file=None,password=None):
#def __init__(self,hostname=None,password=None,username=None,port=None,local_dir=None,remote_dir=None):
self .hostname = hostname
self .username = username
self .password = password
self .scp = paramiko.SSHClient()
self .scp.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self .scp = paramiko.Transport((hostname, 22 ))
self .scp.connect(username = username, password = password)
self .sftp = paramiko.SFTPClient.from_transport( self .scp)
def _walk_remote( self , dirpath):
dirnames = []
filenames = []
for fd in self .sftp.listdir_attr(dirpath):
if S_ISDIR(fd.st_mode):
dirnames.append(fd.filename)
else :
filenames.append(fd.filename)
yield dirpath, dirnames, filenames
for dirname in dirnames:
new_dirpath = os.path.join(dirpath, dirname)
# yield from self._walk_remote(new_dirpath)
for walk in self ._walk_remote(new_dirpath):
yield walk
def getall( self ,local,remote):
st_mode = self .sftp.stat(remote).st_mode
if not S_ISDIR(st_mode):
filename = os.path.basename(remote)
self .sftp.get(remote, os.path.join(local, filename))
else :
parent, child = os.path.split(remote)
for dirpath, dirnames, filenames in self ._walk_remote(remote):
dirpath = dirpath.replace(parent, '.' )
for dirname in dirnames:
try :
os.makedirs(os.path.join(local, dirpath, dirname))
except :
pass
for filename in filenames:
localpath = os.path.join(local, dirpath, filename)
remotepath = os.path.join(parent, dirpath, filename)
self .sftp.get(remotepath, localpath)
self .scp.close()
if __name__ = = '__main__' :
print "-" * 50
#getthread=get_thread()
#room_pathd = '/opt/src/logs/'
#room_paths = '/home/python/'
f = file ( '/home/filelist' , 'r' )
c = f.readlines()
for x in c:
hostname = x.split( '::' )[ 0 ]
password = x.split( '::' )[ 1 ]
username = x.split( '::' )[ 2 ]
local = x.split( '::' )[ 3 ].strip( '\n' )
remote = x.split( '::' )[ 4 ].strip( '\n' )
print local,remote
getthread = get_thread(hostname,password,username)
getthread.getall(local,remote)
f.close()
#getthread.getall(room_paths,room_pathd)
|
最后,又想实现多进程,但是碰到困难了,没有实现,报错
UnpickleableError: Cannot pickle <type 'thread.lock'> objects
报错版 不可用,待改进
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
78
79
80
81
82
83
84
|
#!/usr/bin/python import pexpect
import paramiko
import os
import sys
import time
import multiprocessing
import datetime
import crash_on_ipy
from stat import S_ISDIR
import copy_reg
import types
ip_list = []
#room_id = sys.argv[1] cur_time = datetime.datetime.now()
class get_thread():
def __init__( self ,hostname = 'ip' ):
self .hostname = 'ip'
self .scp = paramiko.SSHClient()
self .scp.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self .scp = paramiko.Transport((hostname, 22 ))
self .scp.connect(username = 'tomcat' , password = 'xx' )
self .sftp = paramiko.SFTPClient.from_transport( self .scp)
def walk_remote( self , dirpath):
dirnames = []
filenames = []
for fd in self .sftp.listdir_attr(dirpath):
if S_ISDIR(fd.st_mode):
dirnames.append(fd.filename)
else :
filenames.append(fd.filename)
yield dirpath, dirnames, filenames
for dirname in dirnames:
new_dirpath = os.path.join(dirpath, dirname)
# yield from self.walk_remote(new_dirpath)
for walk in self .walk_remote(new_dirpath):
yield walk
def __call__( self ,local,remote):
return self .getall(local,remote)
def getall( self ,local,remote):
st_mode = self .sftp.stat(remote).st_mode
if not S_ISDIR(st_mode):
filename = os.path.basename(remote)
self .sftp.get(remote, os.path.join(local, filename))
else :
parent, child = os.path.split(remote)
for dirpath, dirnames, filenames in self .walk_remote(remote):
dirpath = dirpath.replace(parent, '.' )
for dirname in dirnames:
try :
os.makedirs(os.path.join(local, dirpath, dirname))
except :
pass
for filename in filenames:
localpath = os.path.join(local, dirpath, filename)
remotepath = os.path.join(parent, dirpath, filename)
self .sftp.get(remotepath, localpath)
self .scp.close()
def run( self ):
room_pathd = '/opt/src/logs/'
room_paths = '/home/python/'
pool = multiprocessing.Pool(processes = 1 )
pool.apply_async( self , args = (room_paths,room_pathd))
#pool.apply_async(self.getall,args=(room_paths,room_pathd,))
#pool.apply_async(proxy, args=(self, num,))
#pool.apply_async(self.func, args=(num,))
pool.close()
pool.join()
if __name__ = = '__main__' :
print "-" * 50
getthread = get_thread()
getthread.run()
|
本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1860408,如需转载请自行联系原作者