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