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