Используя Paramiko в Python, проверьте, можно ли удалить каталог - PullRequest
2 голосов
/ 24 октября 2019

Я нашел способ удалить удаленный каталог с помощью Paramiko на основе:
Как удалить все файлы в каталоге на удаленном SFTP-сервере в 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 

1 Ответ

1 голос
/ 24 октября 2019

Невозможно "проверить" фактические разрешения для конкретной операции с протоколом SFTP. SFTP API не предоставляет такую ​​функциональность или достаточную информацию, чтобы вы могли принять решение самостоятельно.
См. Также Как проверить разрешение на чтение с использованием JSch с протоколом SFTP?


Вам придется использовать другой API - например, выполнить некоторый тест в оболочке, используя SSHClient.exec_command. Например, вы можете использовать команду test , например:

test -w /parent/directory
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...