通过 ssh 发送文件夹然后压缩并发回

通过 ssh 发送文件夹然后压缩并发回

我需要将包含 eml 文件的文件夹从“A”发送到“B”,然后使用 7z 压缩它们并发送回“A”,我得到的是

ssh user@server "tar -cf - .folder" | 7z a -si compressed_folder.7z

但它会生成 tar.7z,所以我需要在创建 7z 存档之前解压缩 tar 如何实现?

ps. 由于内存和 CPU 太小,我无法在“A”上压缩它们

答案1

我向你保证它很丑陋,但是我测试过它可以在我的 Linux 机器上运行。

假设:您只想备份一个文件夹(这不容易适应多个文件夹)并且您相信您不会在客户端覆盖任何内容。该文件夹位于远程服务器的主目录中。您可能希望为 ssh 设置无密码身份验证,否则您将不得不输入两次密码。

警告:在执行此操作时可能会有特定于操作系统的怪癖。例如,如果您使用 crontab 执行某些操作,则可能需要使路径更具体。也许您使用的是 BSD,因此bash默认情况下可能没有。我使用 date 命令创建一个唯一的文件名以上传回服务器,但这在不同的主机上可能有所不同。这里也没有错误检查,尽管在脚本中添加它很容易。

我创建了一些变量来简化事情。$cssh 变量使我不必重复 ssh 连接字符串。请注意,我将您的文件夹名称更改为 test/,但由于它只使用一次,所以我没有将其放入变量中。

我将其全部包装在bash或中sh(通常它们在 Linux 上可以互换)以便于抑制输出,但如果您不关心抑制输出,您可以删除它并使其稍微短一些。

bash -c 'file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; cssh="user@host"; folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`; 7z a $file $folder && scp $file $cssh:~ && rm $file && rm -r $folder' > /dev/null 2>&1

如果使用ssh是一项硬性要求,并且您不想使用,scp则可以使用dd通过 ssh 复制文件:

sh -c 'file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; cssh="user@host"; folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`; 7z a $file $folder && dd if=$file | ssh $cssh "dd of=$file" && rm $file && rm -r $folder' > /dev/null 2>&1

我在将档案流式传输到本地主机之前对其进行了 gzip 压缩,因为这样可以为纯文本文件节省大量带宽。您可以删除到 的管道gzip -9c,但如果这样做,则需要删除本地主机上的相应解压缩gzip -d

或者将第一个命令放入脚本中以使其更清晰:

#!/bin/sh

# make a unique file name to temporarily use for storing 7z'd folder
# will look something like bu2019-09-29-00h18m49s_Sunday.7z
file=bu$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).7z; 

# SSH connection strong
cssh="user@host"; 

# downloads the remote folder and gets the name of the folder in one variable
folder=`ssh $cssh "tar -cf - test/ | gzip -9c" | gzip -d | tar -xvf - | head -n 1`;

# compress, upload, remove folder, remove file
7z a $file $folder && scp $file $cssh:~ && rm $file && rm -r $folder

相关内容