我正在尝试在使用 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