有没有办法通过 SSH 在远程系统上使用掩码 (*) 删除文件?

有没有办法通过 SSH 在远程系统上使用掩码 (*) 删除文件?

有没有办法通过 SSH 在远程系统上通过掩码(*)删除文件?

ssh -A -o StrictHostKeyChecking=no user1@server1 'ssh -o StrictHostKeyChecking=no user2@server2 sudo rm -rf /folder/cache-*'

此命令应通过掩码 cache-* 删除远程服务器 2 上的所有文件夹。执行后,文件不会被删除。

如果在server2本地执行此命令,文件将被删除:

sudo rm -rf /folder/cache-*

答案1

这里的问题是,*被扩展了server1
这应该有效:

ssh -A -o StrictHostKeyChecking=no user1@server1 "ssh -o StrictHostKeyChecking=no user2@server2 sudo bash -c 'rm -rf /folder/cache-*'"

sudo此外,请确保您不需要密码server2

编辑1
如果您在通配符方面遇到问题,请使用“shopt -s extglob:

ssh -A -o StrictHostKeyChecking=no user1@server1 "ssh -o StrictHostKeyChecking=no user2@server2 sudo bash -c 'shopt -s extglob; rm -rf /folder/cache-*'"

答案2

这听起来可行。您应该能够使用适当数量的反斜杠来做到这一点。运行 shell 也可能会有所帮助。

建议:为了更安全,不要运行“rm”。而是运行“echo rm”。这样,你就可以看到每个命令看到的内容。

您基本上是在要求 ssh 运行 ssh,以便运行 sudo,以便运行 rm。问题是,无论是 ssh,还是其他 ssh,还是 sudo,还是 rm,都不太可能支持将 * 扩展为文件名。这是由 shell 完成的,而本地系统上的 shell 很可能希望根据本地文件名进行扩展。因此,请在远程系统上运行 shell。

我目前没有时间完全模拟这个测试,但是类似这样的事情:

ssh -A -o StrictHostKeyChecking=no user1@server1'ssh -o StrictHostKeyChecking=no user2@server2"sudo sh -c"echo rm -rf /folder/cache-*""'

(以星号、反斜杠、转义引号、引号和撇号结尾。)

注意 1:但是,有时我不得不使用多达八个反斜杠来转换为一个。(我认为这可能是在远程使用涉及正则表达式的东西时。对于双远程会话,您甚至可能需要两倍的反斜杠。)我建议尝试最多 17 个。(奇数反斜杠,如第 17 个,可能会显示为可见字符。因此,如果有两个反斜杠,则可能表明 16 个被视为一个,然后剩下一个。如果有 3 个,则可能表明 8 个被视为一个,然后剩下一个。)

因此,是这样的:

ssh -A -o StrictHostKeyChecking=no user1@server1'ssh -o StrictHostKeyChecking=no user2@server2"sudo sh -c \\\\\\\\\\\\\\\\\\"echo rm -rf /folder/cache-*\\\\\\\\\\\\\\\\\\""'

是的,使用过多的反斜杠似乎比仔细考虑每次需要使用双斜杠的原因更草率。但我发现,对于构建命令等一次性任务,这通常有效。只需添加反斜杠,然后将其数量减少一个,直到测试看起来恰到好处,通常比尝试充分分析情况以使一切都完美而不需要猜测要快得多。

注意 #2:我希望您使用 ssh 命令行来查看输出。我确实注意到了 Linux 标签。但是,如果您的远程系统是 Linux,而您的本地系统是使用默认为自动关闭的 PuTTY 的 Windows,那么您将看不到 echo 命令的结果。在这种情况下,您要么需要重定向输出(这本身可能有点麻烦,因为在正确的系统上转义字符),要么在 PuTTY 中勾选与 PuTTY 的“干净退出时自动关闭”相关的复选框。

注释 #3:注意我除了添加反斜杠之外所做的更改。首先,我sh -c在组合中插入了“ ”。另外,作为我之前提到的注释的提醒,请注意我将其更改为“ echo rm”。当然,一旦看起来不错,请随意删除字符“ echo

答案3

谢谢大家的帮助。你们太棒了,我没想到会遇到这么多热心人。我还找到了一个解决方案,虽然有点奇怪,但仍然有效。因此,我在目标服务器的 /usr/local/bin/ 上创建了 delete.sh 文件:

#!/bin/bash
/bin/rm -rf $1

然后我执行一个命令:

ssh -A -o StrictHostKeyChecking=no user1@SERVER1 "ssh -o StrictHostKeyChecking=no user2@SERVER2 sudo /usr/local/bin/delete.sh /folder/cache-*"

结果,它按预期工作。

相关内容