我试过通过ssh tar存档,我认为在这个任务中没有什么是棘手的。但后来我需要从包含最新更改目录的路径中tar文件。为了得到这个我使用这样的命令:
cd "$(\ls -1dt ./*/ | head -n 1)"
整个命令如下:
ssh root@$ip "cd /dir1/dir2/ && cd "$(\ls -1dt ./*/ | head -n 1)" && cd /dir3/ && tar -cpf - *.log" > $dir/out.tar
不幸的是我得到了:
./ Recent /:没有这样的文件或目录
我尝试将\ls -1dt ./*/ | head -n 1
更改为\ls -1dt /*/ | head -n 1
然后我得到了:
cd:dir3 /:没有这样的文件或目录
/ dir1 / dir2 /中的所有目录,我正在搜索最近更改的dir,包含dir3目录,这就是为什么以前的错误是不可能的。
另外如果我通过ssh手动转到我的远程机器并逐个执行每个命令(diffirent cd,搜索,tar),搜索将正常工作而不会出错,但在我的情况下我需要"整个字符串& #34;命令,因为它只是我整个自动化脚本的一部分。
如何解决这个问题?
由于
答案 0 :(得分:-1)
用双引号将您提供的命令包装到ssh
,这会导致两种不良行为:
您当前的问题是您的本地shell在将引用的字符串传递给ssh
之前展开它。在这样做时,它在本地执行子shell($(ls ...)
),这可能是远程服务器抱怨找不到结果目录的原因
你有两个双引号字符串和它们之间的子shell。只要子shell返回一个单词就行了,但是如果它的结果包含多个单词,你会突然将多个参数传递给ssh
,这可能会失败
通过在单引号中包含您希望远程主机执行的命令,可以修复/避免这两个问题:
ssh root@$ip 'cd /dir1/dir2/ && cd "$(\ls -1dt ./*/ | head -n 1)" && cd /dir3/ && tar -cpf - *.log' > $dir/out.tar
在这种情况下,您的本地shell不会扩展字符串,并且远程主机将正确执行以下命令(其中它将扩展双引号部分,执行子shell):
cd /dir1/dir2/ && cd "$(\ls -1dt ./*/ | head -n 1)" && cd /dir3/ && tar -cpf - *.log