Python Paramiko каталог ходить по SSH - PullRequest
1 голос
/ 19 июня 2019

Как сделать os.walk() но на другом компьютере через SSH?Проблема в том, что os.walk() выполняется на локальном компьютере, и я хочу подключиться к ssh к другому компьютеру, называемому «солнечным лучом», пройтись по каталогу и сгенерировать хеши MD5 для каждого файла в пределах.

То, что я написал до сих пор, выглядиткак это (код ниже), но это не работает.Любая помощь будет принята с благодарностью.

try:
    hash_array = []
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('sunbeam', port=22, username='xxxx', password='filmlight')

    spinner.start()
    for root, dirs, files in os.walk(_path):
        for file in files:
            file_path = os.path.join(os.path.abspath(root), file)

            #  generate hash code for file
            hash_array.append(genMD5hash(file_path))

            file_nb += 1
    spinner.stop()
    spinner.ok('Finished.')

    return hash_array
except Exception as e:
    print(e)
    return None
finally:
    ssh.close() 

1 Ответ

0 голосов
/ 19 июня 2019

Чтобы рекурсивно вывести список каталогов с помощью Paramiko со стандартным интерфейсом доступа к файлам SFTP, вам необходимо реализовать рекурсивную функцию с использованием SFTPClient.listdir_attr:

def listdir_r(sftp, remotedir):
    for entry in sftp.listdir_attr(remotedir):
        remotepath = remotedir + "/" + entry.filename
        mode = entry.st_mode
        if S_ISDIR(mode):
            listdir_r(sftp, remotepath)
        elif S_ISREG(mode):
            print(remotepath)

На основе Python pysftp get_r из Linux отлично работает на Linux, но не на Windows .


В качестве альтернативы, pysftp реализует os.walk эквивалент: Connection.walktree.


Хотя у вас будут проблемы с получением MD5 удаленного файла с протоколом SFTP.

Хотя Paramiko поддерживает его с помощью своегоSFTPFile.check, большинство SFTP-серверов (особенно самый распространенный SFTP / SSH-сервер - OpenSSH) этого не делают.См .:
Как проверить, успешно ли Paramiko загрузил файл на SFTP-сервер? и
Как выполнить контрольные суммы при передаче файла SFTP для целостности данных?

Так что вам, скорее всего, придется прибегнуть к использованию команды shell md5sum (если у вас есть доступ к оболочке).И как только вам все равно придется использовать оболочку, рассмотрите список файлов с оболочкой, так как это будет на порядок быстрее, чем через SFTP.

См. md5 все файлы в дереве каталогов .

Использование SSHClient.exec_command:
Paramiko: чтение со стандартного вывода удаленно выполненной команды


Обязательное предупреждение: Выполнитьне использовать AutoAddPolicy - таким образом вы теряете защиту от MITM-атак .Для правильного решения см. Paramiko "Неизвестный сервер" .

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