Редактировать в ответ на добавленную информацию (и код):
К коду: я настоятельно рекомендую написать скрипт / программу на принимающей стороне, чтобы поговорить с процессом отправки по ssh pipe . Таким образом, вы получаете полную гибкость.
Самая простая вещь, которая могла бы работать, по-прежнему - отправка архива принимающему хосту. На принимающей стороне отфильтруйте архив с помощью сценария,
- распаковывает каждый файл во временную папку
- пытается добавить операцию
cat >> specific_file
- выводит «запись результата» на стандартный вывод в качестве обратной связи с отправителем
Итак, вы бы сделали:
tar c file1 file2 file3 |
ssh log-bot@remote /home/log-bot/handle_logappends.sh |
while read resultcode filename
do
echo "$filename" resulted in code "resultcode"
done
Чтобы обработать обратную связь в C / C ++, вы должны взглянуть на popen
, которая позволит вам читать потоковую обратную связь, как будто из файла, просто!
Пример такого сценария handle_logappends.sh
на принимающей стороне:
#!/bin/bash
set -e # bail on error
TEMPDIR="/tmp/.receiving_$RANDOM"
mkdir "$TEMPDIR"
trap "rm -rf '$TEMPDIR/'" INT ERR EXIT
tar x -v -C "$TEMPDIR/" | while read filename
do
echo "unpacked file $filename" > /dev/stderr
## implement your file append logic here :)
## e.g. (?):
cat "$TEMPDIR/$filename" >> "result/$filename"
## HERE COMES THE FEEDBACK PART: '<code> <filename>'
echo "$?" "$filename"
done
Действительно приятная часть этого заключается в том, что , поскольку все находится в потоковом режиме , обратная связь для первого файла (ов) может поступать , в то время как отправляющий tar все еще отправляет более поздние файлы к принимающему хосту. Нет ненужных задержек!
Я включил чуть-чуть вменяемой обработки / очистки ошибок, но я бы предложил
- возможно, сначала получить весь архив, а затем перебирать файлы?
- выполняет добавление атомарным способом (то есть для копии, затем перемещает копию на место только , если вся операция добавления выполнена успешно; это предотвращает частично добавленные журналы)
Надеюсь, это поможет!
Предыдущий ответ:
Обычно вы используете хитрые маленькие хитрости ( не ), такие как:
tar c file1 file2 file3 | ssh user@host -i /root/.ssh/id_rsa "tar x -C result/ -"
Добавьте подробный флаг, чтобы увидеть детали прогресса
tar c file1 file2 file3 | ssh user@host -i /root/.ssh/id_rsa "tar xvC result/ -"
Если вы хотите, вы можете заменить cpio
на tar. Добавьте опции, чтобы получить больше функциональности (-p
для сохранения разрешений, например)
Чтобы выполнить различные отдельные шаги для одного логического соединения, вы можете использовать ssh Master соединение:
ssh user@host -i /root/.ssh/id_rsa -MNf # login, master, background without a command
for specific_file in file1 file2 file3
do
cat "$specific_file" |
ssh user@host -Mi /root/.ssh/id_rsa "cat >> 'result/$specific_file'"
# check/use error code
done