Python 使用Paramiko递归目录下载?

Python 使用Paramiko递归目录下载?,python,ssh,paramiko,Python,Ssh,Paramiko,我想通过SSH递归下载包含未知内容的目录,并一直在尝试Paramiko。我见过几个如何上传目录的例子,但没有一个涉及递归下载 我可以列出目录中的所有项目,但无法找到知道该项目是文件(要下载)还是目录(要递归调用)的方法 那么我如何知道一个项目是文件还是目录呢?如果你使用Linux或Unix之类的系统。您可以将“文件”实用程序与popen一起使用。 或者简单u可以使用os.path.isdir()=)您可以使用sftp对象的stat()方法: …假设sftp是一个开放的Paramiko-sftp

我想通过SSH递归下载包含未知内容的目录,并一直在尝试Paramiko。我见过几个如何上传目录的例子,但没有一个涉及递归下载

我可以列出目录中的所有项目,但无法找到知道该项目是文件(要下载)还是目录(要递归调用)的方法


那么我如何知道一个项目是文件还是目录呢?

如果你使用Linux或Unix之类的系统。您可以将“文件”实用程序与popen一起使用。 或者简单u可以使用os.path.isdir()=)

您可以使用sftp对象的stat()方法:

…假设
sftp
是一个开放的Paramiko-sftp连接。

stat()方法和其他属性一起返回权限。d(例如DRWXRWX)显示它是目录

例如:

dir = oct(sftp.stat(path).st_mode)
print dir[0:2]
输出插值: 01先进先出 02字符特殊 04目录 06街区特价 10常规文件 12符号链接
14 socket

一个老问题,但我提出的一个解决方案效果很好,有点马虎(打字、斜杠等等),但确实有效

注意:这使用
fabric.api.local
在目标中创建目录

def sftp_get_recursive(path, dest, sftp=sftp):
    item_list = sftp.listdir(path)
    dest = str(dest)

    if not os.path.isdir(dest):
        local("mkdir %s" % dest)

    for item in item_list:
        item = str(item)

        if is_directory(path + "/" + item, sftp):
            sftp_get_recursive(path + "/" + item, dest + "/" + item, sftp)
        else:
            sftp.get(path + "/" + item, dest + "/" + item)

Paramiko不支持递归操作

你可以用。它是一个围绕Paramiko的包装器,具有更多类似Python的外观,并支持递归操作。看


或者,您也可以只基于您的代码。或者看看我的答案。

请用地道的英语。除此之外,使用
file
来测试某个东西是否是文件夹是相当混乱的。在远程文件上使用
os.path.isdir()。还没有测试它,但幸运的是,目录标志可以在SFTPAttributes.st_模式下解析。现在我只需要研究在模式值中隐藏了什么标志…使用rsync是一个选项吗?现在无法对此进行测试,但这似乎为完整答案添加了最后缺失的部分。在这里移动接受标志。
dir = oct(sftp.stat(path).st_mode)
print dir[0:2]
def sftp_get_recursive(path, dest, sftp=sftp):
    item_list = sftp.listdir(path)
    dest = str(dest)

    if not os.path.isdir(dest):
        local("mkdir %s" % dest)

    for item in item_list:
        item = str(item)

        if is_directory(path + "/" + item, sftp):
            sftp_get_recursive(path + "/" + item, dest + "/" + item, sftp)
        else:
            sftp.get(path + "/" + item, dest + "/" + item)