отправить папку через ssh, затем сжать и отправить обратно

отправить папку через ssh, затем сжать и отправить обратно

Мне нужно отправить папку с eml-файлами из «A» в «B», затем сжать их с помощью 7z и отправить обратно в «A». У меня есть следующее:

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

но он создает tar.7z, поэтому мне нужно распаковать tar перед созданием архива 7z. Как этого добиться?

пс. я не могу сжать их на "А" из-за малого объема оперативной памяти и процессора

решение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

Связанный контент