Rsync sobre shell personalizado com fifo

2

Estou tentando usar o rsync em um shell personalizado criado com o fifo. No entanto, não consigo encontrar uma maneira de lidar com isso:

O script initsh para simular um shell padrão pelo fifo:

#!/bin/bash

rm fin
mkfifo fin
rm fout
mkfifo fout
rm ferr
mkfifo ferr
rm farg
mkfifo farg

read arg <farg
cat fin | /bin/bash -i -c "$arg" 1>fout 2>ferr

Este script funciona bem, você pode testá-lo executando (cat fout &) && echo ls > farg

O script rsh para passar para o rsync:

#!/bin/bash

shift;
cat fout &
cat ferr 1>&2 &
echo "$@" | tee -a out > farg
cat | tee -a out > fin

sleep 2
kill %%
exit

A maneira de chamar o rsync com:

rsync -e './rsh' user@fakehost:/

Funciona bem quando você executa echo ./rsh , você tem o shell como o rsync espera. Mas quando o rsync o executa, ele não fecha stdin e, portanto, aguarda a parada (o EOF) de "cat | ...". Eu também tentei com exec 0<>fin , mas não funciona de todo.

Existe algum truque para fechar o identificador corretamente? Ou você tem alguma outra abordagem?

    
por Xorax 20.10.2015 / 11:53

1 resposta

1

você pode esperar que o comando cat fout termine como:

#!/bin/bash

shift;
cat fout &
foutid=$!
cat ferr 1>&2 &
echo "$@" | tee -a out > farg
cat | tee -a out > fin <&0 &

wait $foutid

sleep 2
kill %%
exit
    
por 20.10.2015 / 17:07