pythonsftpparamikostat

Using Paramiko in Python check if directory can be deleted


I found out a way to delete a remote directory using Paramiko based on:
How to delete all files in directory on remote SFTP server in Python?

However, if directory does not have valid permissions than it would fail. I have moved deletion to an exception block. However, is there a way to check if directory has valid permissions to delete?

Currently, what I notice is that in a recursive directory, if one of the sub-directory does not write permissions, then it would fail to delete, but I want deletion to continue and ignore the one missing necessary permission. But, if the root directory itself doesn't have valid permission, then throw and exception and bail out with appropriate exit code.

How can I do this?

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 

Solution

  • It's not possible to "check" for actual permissions for a specific operation with SFTP protocol. SFTP API does not provide such functionality nor enough information for you to decide on your own.
    See also How to check for read permission using JSch with SFTP protocol?


    You would have to use another API – e.g. execute some test in a shell using SSHClient.exec_command. For example you can use the test command, e.g.:

    test -w /parent/directory