天天看點

python sftp

<code>sftp</code>

<code>s_file </code><code>=</code>  <code>path.join(path_name,name).replace(</code><code>'\\','</code><code>/</code><code>')</code>

<code>def</code> <code>process_sftp_dir(path_name):</code>

<code>                </code><code>"""</code>

<code>                </code><code>此函數遞歸處理sftp server端的目錄和檔案,并在client端建立所有不存在的目錄,然後針對每個檔案在兩端的全路徑執行get操作.</code>

<code>                </code><code>path_name第一次的引用值應該是source_path的值</code>

<code>                </code><code>d_path </code><code>=</code> <code>path_name.replace(source_path,destination_path,</code><code>1</code><code>)</code>

<code>                </code><code>if</code> <code>not</code>  <code>path.exists(d_path):    </code><code># 若目标目錄不存在則建立</code>

<code>                    </code><code>print</code><code>(</code><code>'%s----Create Local Dir: %s'</code> <code>%</code> <code>(</code><code>' '</code><code>*</code><code>8</code><code>,d_path))</code>

<code>                    </code><code>try</code><code>:</code>

<code>                         </code><code>makedirs(d_path)    </code><code># 遞歸建立不存在的目錄</code>

<code>                    </code><code>except</code> <code>Exception as err:</code>

<code>                        </code><code>print</code><code>(</code><code>'%s----Create %s Failed'</code> <code>%</code> <code>(</code><code>' '</code><code>*</code><code>8</code><code>,d_path))</code>

<code>                        </code><code>print</code><code>(</code><code>'{}----{}'</code><code>.</code><code>format</code><code>(</code><code>' '</code><code>*</code><code>8</code><code>,err))</code>

<code>                        </code><code>exit(</code><code>10</code><code>)</code>

<code>                </code><code>for</code> <code>name </code><code>in</code> <code>(i </code><code>for</code> <code>i </code><code>in</code> <code>sftp.listdir(path</code><code>=</code><code>path_name) </code><code>if</code> <code>not</code> <code>i.startswith(</code><code>'.'</code><code>)):</code>

<code>                    </code><code>"""去掉以.開頭的檔案或目錄"""</code>

<code>                    </code><code>s_file </code><code>=</code>  <code>path.join(path_name,name).replace(</code><code>'\\','</code><code>/</code><code>')    # 在win環境下組合路徑所用的'</code><code>\\</code><code>'換成'</code><code>/</code><code>'</code>

<code>                    </code><code>d_file </code><code>=</code> <code>s_file.replace(source_path,destination_path,</code><code>1</code><code>)    </code><code># 目标端全路徑</code>

<code>                    </code><code>chk_r_path_result </code><code>=</code> <code>check_remote_path(s_file)</code>

<code>                    </code><code>if</code> <code>chk_r_path_result </code><code>=</code><code>=</code> <code>'file'</code><code>:    </code><code># 檔案</code>

<code>                        </code><code>sftp_get(s_file,d_file,</code><code>12</code><code>)</code>

<code>                    </code><code>elif</code> <code>chk_r_path_result </code><code>=</code><code>=</code> <code>'directory'</code><code>:    </code><code># 目錄</code>

<code>                        </code><code>process_sftp_dir(s_file)    </code><code># 遞歸調用本身</code>

<code>            </code><code>process_sftp_dir(source_path)</code>

參考

<a href="http://kaifly.blog.51cto.com/3209616/1832200" target="_blank">http://kaifly.blog.51cto.com/3209616/1832200</a>

http://wangwei007.blog.51cto.com/68019/1285412

sftp:

sftp.listdir

s_file =  path.join(path_name,name).replace('\\','/') 

指定源全路徑下載下傳

<code>第一個例子</code>

<code>from</code> <code>paramiko </code><code>import</code> <code>SSHClient, AutoAddPolicy</code>

<code>from</code> <code>os </code><code>import</code> <code>path, walk, makedirs</code>

<code>from</code> <code>re </code><code>import</code> <code>split, match, search</code>

<code>from</code> <code>sys </code><code>import</code> <code>exit</code>

<code>import</code> <code>datetime</code>

<code>server_ip</code><code>=</code><code>'192.168.1.100'</code>

<code>port</code><code>=</code><code>22</code>

<code>user</code><code>=</code><code>'root'</code>

<code>password</code><code>=</code><code>'123456'</code>

<code>client </code><code>=</code> <code>SSHClient()</code>

<code>client.set_missing_host_key_policy(AutoAddPolicy())</code>

<code>try</code><code>:</code>

<code>    </code><code>client.connect(server_ip, port</code><code>=</code><code>port, username</code><code>=</code><code>user, password</code><code>=</code><code>password)</code>

<code>except</code> <code>Exception as err:</code>

<code>    </code><code>print</code><code>(</code><code>'{}----{} error: {}'</code><code>.</code><code>format</code><code>(</code><code>' '</code><code>*</code><code>4</code><code>,server_ip,err))</code>

<code>sftp </code><code>=</code> <code>client.open_sftp()</code>

<code>def</code> <code>sftp_transfer_rcmd(cmd</code><code>=</code><code>None</code><code>, space</code><code>=</code><code>None</code><code>):</code>

<code>    </code><code>stdin, stdout, stderr </code><code>=</code> <code>client.exec_command(cmd)</code>

<code>    </code><code>copy_out, copy_err </code><code>=</code> <code>stdout.readlines(), stderr.readlines()</code>

<code>    </code><code>if</code> <code>len</code><code>(copy_err) !</code><code>=</code> <code>0</code><code>:</code>

<code>        </code><code>for</code> <code>i </code><code>in</code> <code>copy_err:</code>

<code>            </code><code># print('%s----%s' % (' ' * space, i), end='')</code>

<code>            </code><code>print</code> <code>i</code>

<code>            </code><code>exit(</code><code>10</code><code>)</code>

<code>    </code><code>else</code><code>:</code>

<code>        </code><code>return</code> <code>copy_out</code>

<code>def</code> <code>check_remote_path(r_path):</code>

<code>    </code><code>check_cmd </code><code>=</code> <code>'if [ -e {0} ];then if [ -d {0} ];then echo directory;elif [ -f {0} ];then echo file;fi;else echo no_exist;fi'</code><code>.</code><code>format</code><code>(</code>

<code>        </code><code>r_path)</code>

<code>    </code><code>check_result </code><code>=</code> <code>sftp_transfer_rcmd(cmd</code><code>=</code><code>check_cmd)[</code><code>0</code><code>].strip(</code><code>'\n'</code><code>)</code>

<code>    </code><code>if</code> <code>check_result </code><code>=</code><code>=</code> <code>'directory'</code><code>:</code>

<code>        </code><code>return</code> <code>'directory'</code>

<code>    </code><code>elif</code> <code>check_result </code><code>=</code><code>=</code> <code>'file'</code><code>:</code>

<code>        </code><code>return</code> <code>'file'</code>

<code>        </code><code>return</code> <code>'no_exist'</code>

<code>'''</code>

<code>#d:/ftp/opt/...</code>

<code>def process_sftp_dir(src_dir,dest_dir):</code>

<code>    </code><code>for name in (i for i in sftp.listdir(path=dest_dir) if not i.startswith('.')):</code>

<code>        </code><code>dest_dir_file=path.join(dest_dir,name).replace('\\','/')</code>

<code>        </code><code>result=check_remote_path(dest_dir_file)</code>

<code>        </code><code>src_dir_files = src_dir.replace('\\', '/')</code>

<code>        </code><code>src_dir_file = path.join(src_dir_files, dest_dir_file[1:]).replace('\\', '/')</code>

<code>        </code><code>if result == 'directory':</code>

<code>            </code><code>dest_dir_dirs = path.join(src_dir_files,dest_dir_file[1:]).replace('\\', '/')</code>

<code>            </code><code>if not path.exists(dest_dir_dirs):</code>

<code>                </code><code>makedirs(dest_dir_dirs)</code>

<code>            </code><code>process_sftp_dir(src_dir, dest_dir_file)</code>

<code>        </code><code>elif result == 'file':</code>

<code>            </code><code>print src_dir_file</code>

<code>            </code><code>sftp.get(dest_dir_file,src_dir_file)</code>

<code>d:/ftp/test/...</code>

<code>def</code> <code>down_sftp_dir(source_path,destination_path):</code>

<code>    </code><code>for</code> <code>name </code><code>in</code> <code>(i </code><code>for</code> <code>i </code><code>in</code> <code>sftp.listdir(path</code><code>=</code><code>source_path) </code><code>if</code> <code>not</code> <code>i.startswith(</code><code>'.'</code><code>)):</code>

<code>        </code><code>s_file </code><code>=</code> <code>path.join(source_path, name).replace(</code><code>'\\', '</code><code>/</code><code>')</code>

<code>        </code><code>result </code><code>=</code> <code>check_remote_path(s_file)</code>

<code>        </code><code>d_file </code><code>=</code> <code>s_file.replace(source_path, destination_path, </code><code>1</code><code>)</code>

<code>        </code><code>if</code> <code>result </code><code>=</code><code>=</code> <code>'directory'</code><code>:</code>

<code>            </code><code>if</code> <code>not</code> <code>path.exists(d_file):</code>

<code>                </code><code>makedirs(d_file)</code>

<code>            </code><code>down_sftp_dir(s_file, d_file)</code>

<code>        </code><code>elif</code> <code>result </code><code>=</code><code>=</code> <code>'file'</code><code>:</code>

<code>            </code><code>sftp.get(s_file, d_file)</code>

<code>def</code> <code>upload_sftp_dir(source_path,destination_path):</code>

<code>    </code><code>for</code> <code>root, dirs, files </code><code>in</code> <code>walk(source_path):</code>

<code>        </code><code>for</code> <code>filespath </code><code>in</code> <code>files:</code>

<code>            </code><code>local_file </code><code>=</code> <code>path.join(root, filespath)</code>

<code>            </code><code>a </code><code>=</code> <code>local_file.replace(source_path, '')</code>

<code>            </code><code>remote_file </code><code>=</code> <code>path.join(destination_path, a).replace(</code><code>'\\', '</code><code>/</code><code>')</code>

<code>            </code><code>try</code><code>:</code>

<code>                </code><code>sftp.put(local_file, remote_file)</code>

<code>            </code><code>except</code> <code>Exception, e:</code>

<code>                </code><code>sftp.mkdir(path.split(remote_file)[</code><code>0</code><code>])</code>

<code>            </code><code>print</code> <code>"upload %s to remote %s"</code> <code>%</code> <code>(local_file, remote_file)</code>

<code>        </code><code>for</code> <code>name </code><code>in</code> <code>dirs:</code>

<code>            </code><code>local_path </code><code>=</code> <code>path.join(root, name)</code>

<code>            </code><code>a </code><code>=</code> <code>local_path.replace(source_path, '')</code>

<code>            </code><code>remote_path </code><code>=</code> <code>path.join(destination_path, a).replace(</code><code>'\\', '</code><code>/</code><code>')</code>

<code>                </code><code>sftp.mkdir(remote_path)</code>

<code>                </code><code>print</code> <code>"mkdir path %s"</code> <code>%</code> <code>remote_path</code>

<code>                </code><code>print</code> <code>e</code>

<code>    </code><code>print</code> <code>'upload file success %s '</code> <code>%</code> <code>datetime.datetime.now()</code>

<code>if</code> <code>__name__</code><code>=</code><code>=</code><code>'__main__'</code><code>:</code>

<code>    </code><code>destination_path</code><code>=</code><code>'d:\\ftp\\'</code>

<code>    </code><code>source_path</code><code>=</code><code>'/opt/ftp/'</code>

<code>    </code><code>upload_sftp_dir(destination_path, source_path)</code>

<code>    </code><code>client.close()</code>

<code>第二個例子</code>

<code>parent, child </code><code>=</code> <code>os.path.split(s_file)</code>

<code>print</code> <code>parent,child</code>

<code>/</code><code>tmp</code><code>/</code><code>test</code><code>/</code><code>testno testno</code>

<code>#!/usr/bin/python   </code>

<code>import</code> <code>pexpect</code>

<code>import</code> <code>wparamiko</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>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>class</code> <code>run_cmd():</code>

<code>      </code><code>def</code> <code>__init__(</code><code>self</code><code>,hostname</code><code>=</code><code>None</code><code>,password</code><code>=</code><code>None</code><code>,username</code><code>=</code><code>None</code><code>,port</code><code>=</code><code>None</code><code>,echo_cmd</code><code>=</code><code>None</code><code>):</code>

<code>          </code><code>#threading.Thread.__init__(self)</code>

<code>          </code><code>self</code><code>.hostname</code><code>=</code><code>hostname</code>

<code>          </code><code>self</code><code>.password</code><code>=</code><code>password</code>

<code>          </code><code>self</code><code>.username</code><code>=</code><code>username</code>

<code>          </code><code>self</code><code>.port</code><code>=</code><code>port</code>

<code>          </code><code>self</code><code>.echo_cmd</code><code>=</code><code>echo_cmd</code>

<code>          </code><code>#self.thread_stop=False</code>

<code>      </code><code>def</code> <code>run(</code><code>self</code><code>):</code>

<code>          </code><code>wparamiko.util.log_to_file(</code><code>'paramiko.log'</code><code>)</code>

<code>          </code><code>s</code><code>=</code><code>wparamiko.SSHClient()</code>

<code>          </code><code>s.set_missing_host_key_policy(wparamiko.AutoAddPolicy())</code>

<code>          </code><code>s.connect(hostname </code><code>=</code> <code>self</code><code>.hostname,username</code><code>=</code><code>self</code><code>.username, password</code><code>=</code><code>self</code><code>.password)</code>

<code>          </code><code>stdin,stdout,stderr</code><code>=</code><code>s.exec_command(</code><code>self</code><code>.echo_cmd)</code>

<code>          </code><code>return</code> <code>stdout.readlines()</code>

<code>          </code><code>s.close()</code>

<code>      </code><code>def</code> <code>stop(</code><code>self</code><code>):</code>

<code>           </code><code>self</code><code>.thread_stop</code><code>=</code><code>True</code>

<code>class</code> <code>get_thread():</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>wparamiko.SSHClient()</code>

<code>        </code><code>self</code><code>.scp.set_missing_host_key_policy(wparamiko.AutoAddPolicy())</code>

<code>        </code><code>self</code><code>.scp </code><code>=</code> <code>wparamiko.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>#self.scp.connect(username='tomcat', password='faJxjj/scadmin^o2o&amp;f8com1')</code>

<code>        </code><code>self</code><code>.sftp </code><code>=</code> <code>wparamiko.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>parentc </code><code>=</code> <code>os.path.join(local,dirpath)</code>

<code>                </code><code>if</code> <code>not</code> <code>os.path.exists(parentc):</code>

<code>                  </code><code>os.makedirs(parentc)</code>

<code>                </code><code>for</code> <code>dirname </code><code>in</code> <code>dirnames:</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>    </code><code>port </code><code>=</code> <code>22</code>

<code>    </code><code>now </code><code>=</code> <code>datetime.datetime.now()</code>

<code>    </code><code>strdatetime </code><code>=</code> <code>now.strftime(</code><code>"%Y-%m-%d"</code><code>)</code>

<code>    </code><code>year</code><code>=</code><code>strdatetime.split(</code><code>'-'</code><code>)[</code><code>0</code><code>]</code>

<code>    </code><code>mon</code><code>=</code><code>strdatetime.split(</code><code>'-'</code><code>)[</code><code>1</code><code>]</code>

<code>    </code><code>day</code><code>=</code><code>strdatetime.split(</code><code>'-'</code><code>)[</code><code>2</code><code>]</code>

<code>    </code><code>Datenow1</code><code>=</code> <code>year </code><code>+</code> <code>"/"</code> <code>+</code> <code>mon </code><code>+</code> <code>"/"</code> <code>+</code> <code>day </code><code>+</code> <code>"/"</code>

<code>    </code><code>Datenow</code><code>=</code> <code>year </code><code>+</code> <code>"/"</code> <code>+</code> <code>mon</code>

<code>    </code><code>print</code> <code>"-"</code><code>*</code><code>50</code>

<code>    </code><code>#getthread=get_thread()</code>

<code>    </code><code>#room_pathd = '/opt/src/logs/crm/'</code>

<code>    </code><code>#room_paths = '/home/python/'</code>

<code>    </code><code>f </code><code>=</code> <code>file</code><code>(</code><code>'/home/python/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>remotes </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>localz</code><code>=</code><code>local </code><code>+</code> <code>"/"</code> <code>+</code> <code>mon </code><code>+</code> <code>"/"</code> <code>+</code> <code>day</code>

<code>        </code><code>if</code> <code>remotes.endswith(</code><code>'/'</code><code>):</code>

<code>            </code><code>remote1 </code><code>=</code> <code>remotes </code><code>+</code> <code>Datenow</code>

<code>            </code><code>remote2 </code><code>=</code> <code>remotes </code><code>+</code> <code>Datenow1</code>

<code>            </code><code>remote3 </code><code>=</code> <code>remotes</code>

<code>        </code><code>if</code> <code>not</code> <code>os.path.exists(localz):</code>

<code>            </code><code>remote </code><code>=</code> <code>remote1</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>remote </code><code>=</code> <code>remote2</code>

<code>            </code><code>echo_cmd</code><code>=</code><code>'/bin/find %s -maxdepth 1 -type d -mmin -50'</code> <code>%</code> <code>(remote)</code>

<code>            </code><code>cmd_thread</code><code>=</code><code>run_cmd(hostname,password,username,port,echo_cmd)</code>

<code>            </code><code>result</code><code>=</code><code>cmd_thread.run()</code>

<code>            </code><code>del</code> <code>result[</code><code>0</code><code>]</code>

<code>            </code><code>for</code> <code>item </code><code>in</code> <code>result:</code>

<code>                </code><code>print</code> <code>str</code><code>(item)</code>

<code>                </code><code>items </code><code>=</code> <code>item.strip(</code><code>'\n'</code><code>)</code>

<code>                </code><code>getthread</code><code>=</code><code>get_thread(hostname,password,username)</code>

<code>                </code><code>getthread.getall(localz,items)</code>

<code>                </code><code>#getthread.getall(localz,'/opt/src/logs/service/o2o-admin/2016/10/28/test')</code>

<code>    </code><code>f.close()</code>

<code>   </code><code>#getthread.getall(room_paths,room_pathd)</code>

<code>主要os.path.join搞得頭大</code>

<code># !/usr/bin/env python</code>

<code># -*-coding:utf-8-*-</code>

<code>import</code> <code>os,sys</code>

<code>local</code><code>=</code><code>'/home/logs/a/'</code>

<code>remote</code><code>=</code><code>'/opt/src/logs/a/test-dmin/'</code>

<code>#remote='/opt/src/logs/a/test-dmin' 這兩者結果是不一樣的</code>

<code>parent, child </code><code>=</code> <code>os.path.split(remote)</code>

<code>print</code> <code>parent</code>

<code>dirpath</code><code>=</code><code>remote</code>

<code>dirpath </code><code>=</code> <code>dirpath.replace(parent, </code><code>'.'</code><code>)</code>

<code>dirname</code><code>=</code><code>'test/test2'</code>

<code>print</code> <code>local,dirpath,dirname</code>

<code>print</code> <code>os.path.join(local, dirpath, dirname)</code>

本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1908148,如需轉載請自行聯系原作者