Fifoで作成されたカスタムシェルでrsyncを使用しようとしています。しかし、私はそれに対処する方法を見つけることができません:
Fifoによって標準シェルをシミュレートするスクリプトinitsh
:
#!/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
も試してみましたが、まったく機能しません。
ハンドルをきちんと閉じるコツはありますか?または他のアプローチはありますか?
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