Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 通过ssh从最新更改的目录中获取Tar文件_Linux_Bash_Ssh_Tar - Fatal编程技术网

Linux 通过ssh从最新更改的目录中获取Tar文件

Linux 通过ssh从最新更改的目录中获取Tar文件,linux,bash,ssh,tar,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 - *.l

我曾尝试通过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
不幸的是,我得到:

/最近/:没有这样的文件或目录

我已尝试将
\ls-1dt./*/|head-n1
更改为
\ls-1dt/*/|head-n1

然后我得到:

cd:dir3/:没有这样的文件或目录

我正在搜索最近更改的目录/dir1/dir2/中的所有目录都包含dir3目录,这就是前面的错误不可能发生的原因

另外,如果我通过ssh手动转到远程机器并逐个执行每个命令(diffirent cd、search、tar),搜索将正常工作,不会出现错误,但在我的情况下,我需要“整串”命令,因为它只是整个自动化脚本的一部分

如何解决这个问题


谢谢

您将提供给
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):


    Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。也许或者会是一个更好的提问场所。@jww我的印象是,
    bash
    被认为是一种编程语言(wikipedia将其列为除shell之外的“命令语言”),我检查了metaSO,看看是否有反论点,但似乎支持我的观点;您是否有其他来源说明其他情况?(我的部分动机是避免对其他完美答案投反对票,很可能你是最新反对票的来源,但我希望这不会使问题变得不那么有效)Bash脚本,是的。Bash中的命令,不是。@jww不是一个脚本,只是一系列命令吗?如果(单个但组合的)命令位于
    .sh
    文件中,您认为这个问题更合适吗?这里的问题来自于对代码如何解析的理解不足,这似乎是一个语言特性,可以在上面讨论,无论它是在单个命令中使用还是在100行脚本中使用。这显然是一个noob问题,可以作为一个重复来结束(希望能有一点解释来解释这种关系),但我觉得作为一个离题来结束它对提问者是不公平的,因为他为一个新来者提出了一个质量合理的问题。我不想让你撤回任何关闭或关闭投票,但我的印象是社区最近对新来者特别苛刻,虽然这可以合理地解释为坏问题数量的增加,但我觉得我们应该小心,不要反应过度,失去吸引后来可能成为社区资产的人的机会。多谢,我相当粗心!
    cd /dir1/dir2/ && cd "$(\ls -1dt ./*/ | head -n 1)" && cd /dir3/ && tar -cpf - *.log