在 Python 中使用 Paramiko 检查目录是否可以删除

Using Paramiko in Python check if directory can be deleted

我找到了一种使用 Paramiko 删除远程目录的方法,基于:
How to delete all files in directory on remote SFTP server in Python?

但是,如果目录没有有效权限,它将失败。我已将删除移至异常块。但是,有没有办法检查目录是否具有有效的删除权限?

目前,我注意到在递归目录中,如果其中一个子目录没有写入权限,则删除将失败,但我希望继续删除并忽略缺少必要权限的子目录。但是,如果根目录本身没有有效权限,则抛出异常并使用适当的退出代码退出。

我该怎么做?

def rmtree(sftp, remotepath, level=0):

    try:
        for f in sftp.listdir_attr(remotepath):
            rpath = posixpath.join(remotepath, f.filename)
            if stat.S_ISDIR(f.st_mode):
                rmtree(sftp, rpath, level=(level + 1))
            else:
                rpath  = posixpath.join(remotepath, f.filename)
                try:
                    sftp.remove(rpath)
                except Exception as e:
                    print("Error: Failed to remove: {0}".format(rpath))
                    print(e)
    except IOError as io:
        print("Error: Access denied. Do not have permissions to remove: {0} -- {1}".format(remotepath, level))
        print(io)
        if level == 0:
            sys.exit(1)
    except Exception as e:
        print("Error: Failed to delete: {0} -- {1}".format(remotepath, level))
        print(e)
        if level == 0:
            sys.exit(1)
         
    if level <= 2:
        print('removing %s%s' % ('    ' * level, remotepath))
    try:
        sftp.rmdir(remotepath)
    except IOError as io:
        print("Error: Access denied for deleting. Invalid permission")
        print(io)
    
    except Exception as e:
        print("Error: failed while deleting: {0}".format(remotepath))
        print(e)
    
return 

不可能 "check" 获得使用 SFTP 协议的特定操作的实际权限。 SFTP API 不提供此类功能,也不提供足够的信息供您自行决定。
另见 How to check for read permission using JSch with SFTP protocol?


您将不得不使用另一个 API – 例如使用 SSHClient.exec_command. For example you can use the test command 在 shell 中执行一些测试,例如:

test -w /parent/directory