Сравнение MD5 загруженных файлов с файлами на сервере SFTP в Python - PullRequest
1 голос
/ 19 июня 2020

Здесь я пытаюсь перечислить все MD5 загруженных мной файлов и сравнить их с оригиналом, чтобы увидеть, являются ли они одними и теми же файлами. Я не могу получить доступ к серверу, чтобы проверить этот код прямо сейчас, но мне было очень любопытно, сработает ли он ... Есть ли у кого-то лучшее решение или что-то, что они хотели бы изменить?

#!/usr/bin/python3
import paramiko
import pysftp
import os
import sys

print("Localpath eingeben: ")
localpath = input()
print("Remothpath eingeben: ")
remotepath = input()
k = paramiko.RSAKey.from_private_key_file("/home/abdulkarim/.ssh/id_rsa")
c = paramiko.SSHClient()
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
print("connecting")
c.connect( hostname = "do-test", username = "abdulkarim", pkey = k)
print("connected")
sftp = c.open_sftp()
sftp.Connection.get_d(localpath, remotepath)
#sftp.get_d(localpath, remotepath)

def hashCheckDir(f,r):
    files = []
    # r=root, d=directories, f = files
    for r, d, f in os.walk(localpath):
        for file in f:
            if '.txt' in file:
                files.append(os.path.join(r, file))
    files1 = []
    # r=root, d=directories, f = files
    for r, d, f in os.walk(remotepath):
        for file in f:
            if '.txt' in file:
                files.append(os.path.join(r, file))

    for i in range(2):
        for x in files:
            if os.system('md5sum '+ files) == os.system('ssh do-test md5sum '+ files1):
                print ("The lists are identical")
            else :
                print ("The lists are not identical")

hashCheckDir(localpath,remotepath)
c.close()

Я новенький to Python так .. Потерпите меня, если я сделал какую-нибудь глупую ошибку. Может, мне сначала их отсортировать?

1 Ответ

1 голос
/ 22 июня 2020

Это излишне запускать внешнее консольное приложение (ssh) для выполнения md5sum на сервере (и открывать новое соединение для каждого файла поверх этого), если у вас уже есть собственный Python S SH подключение к тому же серверу.

Вместо используйте SSHClient.exec_command:

stdin, stdout, stderr = c.exec_command('md5sum '+ files1)
checksum = stdout.read()

Обратите внимание, что MD5 устарел, используйте SHA- 256 (sha256sum).

Хотя вопрос в том, не является ли проверка контрольной суммы чрезмерной, см .: Как выполнить контрольные суммы во время передачи файла SFTP для целостности данных?

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

...