Paramiko的递归目录下载?

时间:2011-07-13 06:23:35

标签: python ssh paramiko

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

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

transport = paramiko.Transport((MY_IP, 22))
transport.connect(username=MY_NAME, password=MY_PASS)
sftp = paramiko.SFTPClient.from_transport(transport)

file_list = sftp.listdir(path='/home/MY_HOME_DIR')
    for item in file_list:
        # Here is an item name... but is it a file or directory?
        print(item)
sftp.close()
transport.close()

那么我怎么知道某个项目是文件还是目录?

6 个答案:

答案 0 :(得分:11)

from stat import S_ISDIR

def isdir(path):
  try:
    return S_ISDIR(sftp.stat(path).st_mode)
  except IOError:
    #Path does not exist, so by definition not a directory
    return False

...假设sftp是一个开放的Paramiko SFTP连接。

答案 1 :(得分:1)

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

http://www.lag.net/paramiko/docs/paramiko.SFTPClient-class.html

答案 2 :(得分:1)

其他属性中的

stat()方法返回权限。 d(例如drwxrwxrwx)显示它是目录。

例如:

dir = oct(sftp.stat(path).st_mode)
print dir[0:2]

输出interpritation: 01 fifo 02个角色特别 04目录 06块特价 10个常规文件 12符号链接 14插座

答案 3 :(得分:1)

一个老问题,但我提出的解决方案效果很好,它有点草率(类型转换和斜线等) - 但确实有效。

请注意,这使用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)

答案 4 :(得分:0)

Paramiko不支持递归操作。

您可以使用pysftp。它是Paramiko的包装,具有更多类似Python的外观和感觉,并支持递归操作。见

或者您也可以将代码基于pysftp source code。或查看我对Python pysftp get_r from Linux works fine on Linux but not on Windows的回答。

答案 5 :(得分:-5)

如果您使用的是Linux或类Unix。你可以使用popen的'file'实用程序。 或者简单的你可以使用os.path.isdir()=)