web-dev-qa-db-ja.com

fifoを使用したカスタムシェルでのRsync

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も試してみましたが、まったく機能しません。

ハンドルをきちんと閉じるコツはありますか?または他のアプローチはありますか?

2
Xorax

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
1
adonis