我想通过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()
那么我怎么知道某个项目是文件还是目录?
答案 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()=)