fifo를 사용하여 만든 사용자 정의 셸에서 rsync를 사용하려고 합니다. 하지만 처리할 방법을 찾을 수 없습니다.
initsh
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
스크립트는 잘 작동합니다. 다음을 실행하여 테스트할 수 있습니다.(cat fout &) && echo ls > farg
rsync에 전달할 스크립트 rsh
:
#!/bin/bash
shift;
cat fout &
cat ferr 1>&2 &
echo "$@" | tee -a out > farg
cat | tee -a out > fin
sleep 2
kill %%
exit
rsync를 호출하는 방법:
rsync -e './rsh' user@fakehost:/
실행하면 제대로 작동 echo ./rsh
하고 rsync가 기다리고 있는 것과 같은 셸을 얻게 됩니다. 그러나 rsync가 실행되면 stdin을 닫지 않으므로 "cat | ..."의 중지(EOF)를 기다립니다. 저도 해봤는데 exec 0<>fin
전혀 안되네요.
손잡이를 제대로 닫는 비결이 있나요? 아니면 다른 방법이 있나요?
답변1
cat fout
다음과 같이 명령이 끝날 때까지 기다릴 수 있습니다 .
#!/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