【问题标题】:Tar files from the latest changed directory via ssh通过 ssh 从最新更改的目录中提取 Tar 文件
【发布时间】:2018-02-27 16:34:33
【问题描述】:

我曾尝试通过 ssh 进行 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/ 中的所有目录,我正在搜索最近更改的目录,都包含 dir3 目录,这就是为什么以前的错误是不可能的。

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

如何解决?

谢谢

【问题讨论】:

  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super UserUnix & Linux Stack Exchange 会是一个更好的提问地点。
  • @jww 我的印象是bash 被认为是一种编程语言(维基百科将它列为除了 shell 之外的“命令语言”),我检查了 metaSO 看是否有反争论,但the first question I found 似乎支持我的观点;你有没有其他说明的其他来源? (我的部分动机是避免对原本非常好的答案投反对票,而且很可能你是最近投反对票的人,但我希望这不会降低问题的有效性)
  • Bash 脚本,是的。 Bash 中的命令,没有。
  • @jww 不就是一个脚本,只不过是一个命令序列吗?如果(单个但组合的)命令位于 .sh 文件中,您认为这个问题会更合适吗?这里的问题来自对如何解析代码缺乏了解,这似乎是一种可以在 SO 上讨论的语言特性,无论它是在单个命令中使用还是在 100 行脚本中使用。这显然是一个菜鸟问题,可以作为 this one 的副本关闭(希望有点......
  • ...除了解释关系之外的解释),但我觉得关闭它,因为离题对于为新人提出合理质量问题的提问者是不公平的。我不希望你撤回任何接近或反对的投票,但我的印象是社区最近对新人特别苛刻,虽然可以通过增加不良问题的数量来合理解释我觉得我们应该小心,不要反应过度而失去吸引那些后来可能成为社区资产的人的机会

标签: linux bash ssh tar


【解决方案1】:

您将提供给ssh 的命令用双引号括起来,这会导致两种不良行为:

  1. 您的直接问题是您的本地 shell 在将其传递给 ssh 之前扩展了带引号的字符串。这样做时,它会在本地执行 subshel​​l ($(ls ...)),这可能是远程服务器抱怨找不到结果目录的原因

  2. 你有两个双引号字符串和它们之间的子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

【讨论】:

  • 非常感谢,我有点粗心!
猜你喜欢
  • 2021-02-22
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多