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