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

ber*_*sch 4 bash ssh tee

我的错误在哪里?作为对Stackexchange 问题的回答,我 tar 一个目录并将存档传输到远程系统,在那里既存tee放在文件中又通过管道将其tar解压缩。

我原来的命令是tar -cf - mydir | ssh root@192.168.1.248 bash -c "tee archive.tar | tar -xf -". 它创造mydir,但不是archive.tar

对于更简单的测试,我使用cat来证明我可以写入 remote /tmp/outfile,然后/tmp/outfiletee. 但是,tee似乎没有触及文件:

$ ssh root@192.168.1.248 rm -r /tmp/outfile
$ echo data | ssh root@192.168.1.248 bash -cx "cat > /tmp/outfile"
+ cat
$ echo DATA | ssh root@192.168.1.248 bash -cx "tee /tmp/outfile"
DATA
+ tee
$ ssh root@192.168.1.248 cat /tmp/outfile
data
Run Code Online (Sandbox Code Playgroud)

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

远程服务器运行Centos 8。我有一种唠叨的感觉,错误很明显,但我只是没有看到。

roa*_*ima 8

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

ssh root@192.168.1.248 bash -c "tee archive.tar | tar -xf -"
Run Code Online (Sandbox Code Playgroud)

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

bash -c tee archive.tar | tar -xf -
Run Code Online (Sandbox Code Playgroud)

bash实例将tee作为参数分配给-carchive.tar作为传入(随后被忽略)的值作为$0tee在此bash实例下运行的命令没有列出输出文件,因此它只是将其内容通过管道传输到标准输出,在那里它被tar.

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

ssh root@192.168.1.248 'tee archive.tar | tar -xf -'
Run Code Online (Sandbox Code Playgroud)