Передача файла tar.gz через SCP-клиент вызывает повреждение файла - PullRequest
0 голосов
/ 21 мая 2019
  1. Сжать несколько каталогов с сервера Linux через tar.gz
  2. Загрузить сжатый файл tar.gz с сервера на компьютер Windows.
  3. Попробуйте распаковать файл с помощью модуля tarfile pythons
  4. Процесс выдает один из Empty file (Fail to untar)

Мне нужно сделать tar-файл за раз, потому что мне нужно передать много маленьких файлов (большинство из них меньшечем килобайт).Поэтому я пытаюсь: 1) Сжать файлы в файл tar.gz с сервера 2) перенести через клиент SCP1 3) удалить файл tar с сервера (если необходимо) 4) Извлечь загруженный файл из моей программы python.5) Создайте статистику Excel.

Я проверил файл tar.gz с сервера и уверен, что файл не поврежден (я имею в виду, что он хорошо сжат).Он извлекается хорошо без каких-либо ошибок, если я извлекаю их внутри сервера ssh.Но появляется сообщение об ошибке выше, когда я передаю файл tar.gz с сервера через клиент scp внутри моей программы.И когда я передаю файл вручную с помощью FileZilla и извлекаю его с помощью gitbash, он не повреждается.

Я проверил много потоков в Интернете, они обычно говорят, что это проблема бинарного режима scp.Но я не уверен, что я должен сделать, чтобы решить эту проблему.

Я использую scp и paramiko для библиотеки.И эта фаза передачи отвечает за scp модуль.(Я слышал, что это заново созданный клиентский модуль scp происходит от paramiko

import paramiko
from scp import SCPClient
... # (Other class functions)
    def downloadCompressedFile(self, remote_paths, save_path):
        # binarial only
        # remote_paths :: Files to be tared
        # save_path :: Local path to be downloaded
        try:
            print('Compression Targets -->\n{}'.format(', '.join(remote_paths)))
            conn = self.getSSHConnection()
            tar_save_path = '{}/{}.tar.gz'.format(ROOT_TAR_PATH, datetime.now().strftime('%Y%m%d_%H%M%S'))
            obj = [ '-C {} ..'.format(p) for p in remote_paths]
            command = 'tar cvzf {} {}'.format(tar_save_path, ' '.join(obj))
            print('Remote Command -- tar -cvzf {} {}'.format(tar_save_path, ' '.join(obj)))
            conn.exec_command(command=command)
            print('Compressions are done. Downloading files from {} to {}'.format(tar_save_path, save_path))
            with SCPClient(conn.get_transport()) as scp:
                scp.get(remote_path=tar_save_path, local_path=save_path)

        except Exception as e:
            raise Exception(e)
...

Это должно передать не поврежденный файл.

1 Ответ

0 голосов
/ 21 мая 2019

Я полагаю, ваш код не ждет завершения tar.Итак, вы загружаете неполный файл.

См. Дождитесь завершения задачи на удаленном компьютере через Python .

Попробуйте это:

stdin, stdout, stderr = client.exec_command(command)
print('Compression started')
stdout.channel.recv_exit_status() # Wait for tar to complete
print('Compression is done. Downloading files from {} to {}'.format(tar_save_path, save_path))
...