通过 SCP 客户端的 tar.gz 文件传输导致文件损坏
The tar.gz file transfer via SCP client cause corruption of file
- 通过tar.gz
从Linux服务器压缩几个目录
- 从服务器下载压缩的 tar.gz 文件到 Windows 计算机。
- 尝试通过pythons的
tarfile
模块 取消tar文件
- 进程弹出
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二进制模式的问题。但是我不确定我应该怎么做才能解决这个问题。
我使用 scp
和 paramiko
作为 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))
- 通过tar.gz 从Linux服务器压缩几个目录
- 从服务器下载压缩的 tar.gz 文件到 Windows 计算机。
- 尝试通过pythons的
tarfile
模块 取消tar文件
- 进程弹出
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二进制模式的问题。但是我不确定我应该怎么做才能解决这个问题。
我使用 scp
和 paramiko
作为 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))