通过 SCP 客户端的 tar.gz 文件传输导致文件损坏

The tar.gz file transfer via SCP client cause corruption of file

  1. 通过tar.gz
  2. 从Linux服务器压缩几个目录
  3. 从服务器下载压缩的 tar.gz 文件到 Windows 计算机。
  4. 尝试通过pythons的tarfile模块
  5. 取消tar文件
  6. 进程弹出 Empty file 之一(无法取消 tar)

我需要在服务器中创建 tar 文件,因为我需要传输大量小文件(其中大部分小于 1 KB)。所以我尝试 1) 将文件从服务器压缩到 tar.gz 文件 2) 通过 SCP1 客户端传输 3) 从服务器删除 tar 文件(如果需要) 4) 在我的 [=43= 中提取下载的文件] 程序。 5) 创建 excel 统计信息。

我从服务器端检查了 tar.gz 文件,我确定该文件没有损坏(我的意思是它压缩得很好)。如果我在服务器 ssh 中提取它们,它可以很好地提取,没有任何错误。但是当我在我的程序中通过 scp 客户端从服务器传输 tar.gz 文件时,上面会弹出一个错误。当我使用 FileZilla 手动传输文件并使用 gitbash 提取时,它没有损坏。

网上查了很多帖子,一般都说是scp二进制模式的问题。但是我不确定我应该怎么做才能解决这个问题。

我使用 scpparamiko 作为 libaray。这个传输阶段负责 scp 模块。 (听说是re-created scp client模块源于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)
...

它应该传输未损坏的文件。

我相信您的代码不会等待 tar 完成。所以你正在下载一个不完整的文件。

参见

试试这个:

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))