为什么 tee 在通过 ssh 远程启动时拒绝工作?

为什么 tee 在通过 ssh 远程启动时拒绝工作?

我的错误在哪里?作为对一个问题的回答堆栈交换问题,我 tar 一个目录并将存档传输到远程系统,在远程系统中,tee将其存储在文件中并将其通过管道传输以tar进行解包。

我原来的命令是.它创造,但不创造。tar -cf - mydir | ssh [email protected] bash -c "tee archive.tar | tar -xf -"mydirarchive.tar

为了进行更简单的测试,我用cat来证明我可以写入远程/tmp/outfile,然后/tmp/outfile用覆盖tee。但是,tee似乎没有触及该文件:

$ ssh [email protected] rm -r /tmp/outfile
$ echo data | ssh [email protected] bash -cx "cat > /tmp/outfile"
+ cat
$ echo DATA | ssh [email protected] bash -cx "tee /tmp/outfile"
DATA
+ tee
$ ssh [email protected] cat /tmp/outfile
data

/tmp/outfile不存在时,tee不创建它。为什么不用DATAtee覆盖?/tmp/outfile当登录到远程服务器并在那里运行它时,它确实按预期工作。

远程服务器运行 Centos 8。我总感觉错误很明显,但我就是看不到它。

答案1

这是一个经典的引用问题,但在这种情况下您显然已经尝试解决它。考虑你的tar构造,

ssh [email protected] bash -c "tee archive.tar | tar -xf -"

本地 shell 会将其作为其正常处理的一部分进行评估,删除引号、替换变量等。最终结果是,ssh将接收不带双引号的命令行来执行,这就是传递给远程 shell 执行的内容

bash -c tee archive.tar | tar -xf -

bash实例将分配tee为 的实参参数-c,保留archive.tar为作为 传入(随后被忽略)的值$0tee在此实例下运行的命令没有bash列出输出文件,因此它只是将其内容通过管道传输到标准输出它被捕获和处理的地方tar

正确的方法是引用传递给的命令字符串ssh,给出这样的命令

ssh [email protected] 'tee archive.tar | tar -xf -'

相关内容