使用 fifo 通过自定义 shell 进行 Rsync

使用 fifo 通过自定义 shell 进行 Rsync

我正在尝试在使用 fifo 创建的自定义 shell 上使用 rsync 。但是我找不到处理它的方法:

initsh通过 fifo 模拟标准 shell 的脚本:

#!/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 等待的 shell。但是当 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

相关内容