Tar 文件来自最近通过 ssh 更改的目录
Tar files from the latest changed directory via ssh
我已经尝试 tar 通过 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/: No such file or directory
我试过把\ls -1dt ./*/ | head -n 1
改成\ls -1dt /*/ | head -n 1
然后我得到:
cd: dir3/: No such file or directory
/dir1/dir2/ 中的所有目录,我正在为其搜索最近更改的目录,都包含 dir3 目录,这就是为什么以前的错误是不可能的。
此外,如果我通过 ssh 手动转到我的远程机器并逐条执行每个命令(不同的 cd、搜索、tar),搜索将正确无误地工作,但在我的情况下我需要"whole string" 命令,因为它只是我整个自动化脚本的一部分。
如何解决?
谢谢
您将提供给 ssh
的命令用双引号括起来,这会导致两种不良行为:
您的直接问题是您的本地 shell 在将引用的字符串传递给 ssh
之前对其进行了扩展。这样做时,它会在本地执行 subshell ($(ls ...)
),这可能是远程服务器抱怨找不到结果目录
的原因
您有两个 double-quoted 字符串和它们之间的子 shell。只要 subshell returns 一个单词就可以了,但如果它的结果包含多个单词,你会突然将多个参数传递给 ssh
这可能会失败
这两个问题可以fixed/avoided通过在single-quotes中包含您希望远程主机执行的命令:
ssh root@$ip 'cd /dir1/dir2/ && cd "$(\ls -1dt ./*/ | head -n 1)" && cd /dir3/ && tar -cpf - *.log' > $dir/out.tar
在这种情况下,您的本地 shell 不会扩展字符串,远程主机将正确执行以下命令(其中它将扩展 double-quoted 部分,执行 subshell) :
cd /dir1/dir2/ && cd "$(\ls -1dt ./*/ | head -n 1)" && cd /dir3/ && tar -cpf - *.log
我已经尝试 tar 通过 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/: No such file or directory
我试过把\ls -1dt ./*/ | head -n 1
改成\ls -1dt /*/ | head -n 1
然后我得到:
cd: dir3/: No such file or directory
/dir1/dir2/ 中的所有目录,我正在为其搜索最近更改的目录,都包含 dir3 目录,这就是为什么以前的错误是不可能的。
此外,如果我通过 ssh 手动转到我的远程机器并逐条执行每个命令(不同的 cd、搜索、tar),搜索将正确无误地工作,但在我的情况下我需要"whole string" 命令,因为它只是我整个自动化脚本的一部分。
如何解决?
谢谢
您将提供给 ssh
的命令用双引号括起来,这会导致两种不良行为:
您的直接问题是您的本地 shell 在将引用的字符串传递给
ssh
之前对其进行了扩展。这样做时,它会在本地执行 subshell ($(ls ...)
),这可能是远程服务器抱怨找不到结果目录 的原因
您有两个 double-quoted 字符串和它们之间的子 shell。只要 subshell returns 一个单词就可以了,但如果它的结果包含多个单词,你会突然将多个参数传递给
ssh
这可能会失败
这两个问题可以fixed/avoided通过在single-quotes中包含您希望远程主机执行的命令:
ssh root@$ip 'cd /dir1/dir2/ && cd "$(\ls -1dt ./*/ | head -n 1)" && cd /dir3/ && tar -cpf - *.log' > $dir/out.tar
在这种情况下,您的本地 shell 不会扩展字符串,远程主机将正确执行以下命令(其中它将扩展 double-quoted 部分,执行 subshell) :
cd /dir1/dir2/ && cd "$(\ls -1dt ./*/ | head -n 1)" && cd /dir3/ && tar -cpf - *.log