来自最新更改目录的tar文件通过ssh

时间:2018-02-27 16:34:34

标签: linux bash ssh tar

我试过通过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;命令,因为它只是我整个自动化脚本的一部分。

如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:-1)

用双引号将您提供的命令包装到ssh,这会导致两种不良行为:

  1. 您当前的问题是您的本地shell在将引用的字符串传递给ssh之前展开它。在这样做时,它在本地执行子shell($(ls ...)),这可能是远程服务器抱怨找不到结果目录的原因

  2. 你有两个双引号字符串和它们之间的子shell。只要子shell返回一个单词就行了,但是如果它的结果​​包含多个单词,你会突然将多个参数传递给ssh,这可能会失败

  3. 通过在单引号中包含您希望远程主机执行的命令,可以修复/避免这两个问题:

    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