python提供了一个第三方模块paramiko,通过这个模块可以实现两台机器之间的网络连接,sftp是paramiko的一个方法,使用sftp可以在两台机器之间互相传输
拷贝文件。然而paramiko的sftp只能拷贝文件,不能拷贝文件夹。要实现文件夹的拷贝,可以这样子思考:使用深度搜索遍历源目录,若是文件,直接拷贝到
目的目录;若是文件夹,则先在目的目录建立一个子目录,然后遍历子目录...使用递归函数,可以达到完全拷贝目录的目的。实现代码如下:
1.获取一个sftp句柄

import paramiko

#建立连接,获取sftp句柄
def sftp_connect(username,password,host,port=22):
    client = None
    sftp = None
    try:
        client = paramiko.Transport((host,port))
    except Exception as error:
        print error
    else:
        try:
            client.connect(username=username, password=password)
        except Exception as error:
            print error
        else:
            sftp = paramiko.SFTPClient.from_transport(client)
    return client,sftp
#断开连接
def disconnect(client):
    try:
        client.close()
    except Exception as error:
        print error
2.从远程机器上下载文件(夹)到本地

import os

import sys
from stat import S_ISDIR as isdir
def _check_local(local):
    if not os.path.exists(local):
        try:
            os.mkdir(local)
        except IOError as err:
            print err
def get(sftp,remote,local):
    #检查远程文件是否存在
    try:
        result = sftp.stat(remote)
    except IOError as err:
        error = '[ERROR %s] %s: %s' %(err.errno,os.path.basename(os.path.normpath(remote)),err.strerror)
        print error
    else:
        #判断远程文件是否为目录
        if isdir(result.st_mode):
            dirname = os.path.basename(os.path.normpath(remote))
            local = os.path.join(local,dirname)
            _check_local(local)
            for file in sftp.listdir(remote):
                sub_remote = os.path.join(remote,file)
                sub_remote = sub_remote.replace('\\','/')
                get(sftp,sub_remote,local)
        else:   
        #拷贝文件
            if os.path.isdir(local):
                local = os.path.join(local,os.path.basename(remote))
            try:
                sftp.get(remote,local)
            except IOError as err:
                print err
            else:
                print '[get]',local,'<==',remote
3.从本地拷贝文件(夹)到远程机器

import os

def put(sftp,local,remote):
    #检查路径是否存在
    def _is_exists(path,function):
        path = path.replace('\\','/')
        try:
            function(path)
        except Exception as error:
            return False
        else:
            return True
    #拷贝文件
    def _copy(sftp,local,remote):
        #判断remote是否是目录
        if _is_exists(remote,function=sftp.chdir):
            #是,获取local路径中的最后一个文件名拼接到remote中
            filename = os.path.basename(os.path.normpath(local))
            remote = os.path.join(remote,filename).replace('\\','/')
        #如果local为目录
        if os.path.isdir(local):
            #在远程创建相应的目录
            _is_exists(remote,function=sftp.mkdir)
            #遍历local
            for file in os.listdir(local):
                #取得file的全路径
                localfile = os.path.join(local,file).replace('\\','/')
                #深度递归_copy()
                _copy(sftp=sftp,local=localfile,remote=remote)
        #如果local为文件
        if os.path.isfile(local):
            try:
                sftp.put(local,remote)
            except Exception as error:
                print error
                print '[put]',local,'==>',remote,'FAILED'
            else:
                print '[put]',local,'==>',remote,'SUCCESSED'
    #检查local
    if not _is_exists(local,function=os.stat):
        print "'"+local+"': No such file or directory in local"
        return False
    #检查remote的父目录
    remote_parent =  os.path.dirname(os.path.normpath(remote))
    if not _is_exists(remote_parent,function=sftp.chdir):
        print "'"+remote+"': No such file or directory in remote"
        return False
    #拷贝文件
    _copy(sftp=sftp,local=local,remote=remote)

python通过sftp远程传输文件的更多相关文章

  1. golang 远程传输文件

    概述 之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang 执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件, ...

  2. blfs(systemd版本)学习笔记-安装lrzsz软件包实现ssh远程传输文件到lfs系统

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 安装lrzsz软件包实现ssh远程传输文件到lfs系统 这个软件包在lfs系列的书中没有,这里是参照lrzsz官网的说明进行编译 ...

  3. Python+USB+Vnet+FTP传输文件开发记录

    做一个Python+USB+Vnet+FTP传输文件开发记录

  4. Linux远程传输文件免密码

    首先为什么Linux远程传输要免密码?手动使用scp命令传输每次都要输密码太过麻烦了. 开发中有一句话,能复制粘贴尽量不要手打. 运维中有一句话,能脚本化实现尽量不要手动执行. 远程传输文件免密码的目 ...

  5. Python不同电脑之间传输文件实现类似scp功能不输密码

    SCP vs SFTP 通过paramiko还可以传输文件,如何通过paramiko在计算机之间传输文件,通过阅读官方文档,发现有如下两种方式: sftp = paramiko.SFTPClient. ...

  6. sftp远程传输脚本

    该脚本主要是是批量修改文件名,然后传输文件到服务器#!/bin/bash #脚本名:sftp.sh while true do num=`cat test.txt|wc -l` ;a<=$num ...

  7. 远程传输文件命令:scp

    1.概述 scp(secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,其格式为“scp [参数] 本地文件 远程帐户@远程 IP 地址:远程目录”. 与第 2 章讲解的 cp ...

  8. SCP远程传输文件

    今天想用SCP通过局域网传输文件到服务器,但却发生了下面这种事情: 上面描述 连接主机端口22被拒绝,失去连接 后发现因为没有指定端口,我服务器这边改了端口,所以根据自己情况改一下命令 scp -29 ...

  9. scp远程传输文件和ssh远程连接

    ssh使用方法 如果从一台linux服务器通过ssh远程登录到另一台Linux机器, 这种情况通常会在多台服务器的时候用到. 如用root帐号连接一个IP为192.168.1.102的机器,输入:“  ...

随机推荐

  1. 【LeetCode每天一题】 Merge k Sorted Lists(合并K个有序链表)

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  2. ios9 适配的坑

    http://www.cocoachina.com/ios/20151016/13715.html

  3. Linux-nmon系统性能监控工具的使用及报表产出

    在进行性能测试的时候,需要获取服务器的各项指标,例如 CPU.MEM.I/O.DISK 等.网上有很多的监控工具,nmon 就是其中的一个,其可与 JMeter结合使用,测试系统的性能.其概要的介绍, ...

  4. pyqt常用窗口组件

    扩展知识: 熟悉常用的窗口组件: 1 按钮类 QPushButton   普通按钮 QToolButton   工具按钮:通常在工具栏使用 QRadioButton   单选框 QCheckBox   ...

  5. PHP socket通信之UDP

    服务端: //服务器信息 $server = 'udp://127.0.0.1:9998'; //消息结束符号 $msg_eof = "\n"; $socket = stream_ ...

  6. 从0开始搭建vue+webpack脚手架(四)

    之前1-3部分是webpack最基本的配置, 接下来会把项目结构和配置文件重新设计,可以扩充更多的功能模块. 一.重构webpack的配置项 1. 新建目录build,存放webpack不同的配置文件 ...

  7. ES6学习之 解构赋值

    最近看了一个vue的项目,发现作者大量使用了ES6的语法,包括async, Promise, Set, Map还有一些解构赋值, 才发现自己对于ES6的语法缺乏了总结和运用,看得有点艰难,所以重新学习 ...

  8. 并发工具CyclicBarrier

    想想一下这样一个场景,有多个人需要过河,河上有一条船,船要等待满10个人才过河,过完河后每个人又各自行动. 这里的人相当于线程,注意这里,每个线程运行到一半的时候,它就要等待一个条件,即船满过河的条件 ...

  9. [4]Windows内核情景分析---内核对象

    写过Windows应用程序的朋友都常常听说"内核对象"."句柄"等术语却无从得知他们的内核实现到底是怎样的, 本篇文章就揭开这些技术的神秘面纱. 常见的内核对象 ...

  10. yii2 rules验证规则,ajax验证手机号码是否唯一

    <?php namespace frontend\models; use Yii; use yii\base\Model; /** * Signup form */ class SignupFo ...