我的错误在哪里?作为对一个问题的回答堆栈交换问题,我 tar 一个目录并将存档传输到远程系统,在远程系统中,tee
将其存储在文件中并将其通过管道传输以tar
进行解包。
我原来的命令是.它创造,但不创造。tar -cf - mydir | ssh [email protected] bash -c "tee archive.tar | tar -xf -"
mydir
archive.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
为作为 传入(随后被忽略)的值$0
。tee
在此实例下运行的命令没有bash
列出输出文件,因此它只是将其内容通过管道传输到标准输出它被捕获和处理的地方tar
。
正确的方法是引用传递给的命令字符串ssh
,给出这样的命令
ssh [email protected] 'tee archive.tar | tar -xf -'