Мне нужно отправить папку с 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