天天看點

python sftp.get 同步遠端檔案夾 實踐二

主要用途,從本機擷取遠端機器的檔案夾

<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 &lt;type 'thread.lock'&gt; 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,如需轉載請自行聯系原作者