- Сжать несколько каталогов с сервера Linux через tar.gz
- Загрузить сжатый файл tar.gz с сервера на компьютер Windows.
- Попробуйте распаковать файл с помощью модуля
tarfile
pythons - Процесс выдает один из
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)
...
Это должно передать не поврежденный файл.