繁体   English   中英

通过 ssh 和 xargs 删除文件

[英]remove files via ssh and xargs

我正在尝试使用 find 和 xargs 通过 ssh 删除文件。 在本地机器命令正常工作。 我也在使用例外列表。

我试图更改 ' ' 和 "" 之间的括号,但它不起作用。

save_files=(test1 test2)

在本地机器上:

find / -mindepth 1 | grep -vE "$(IFS=\| && echo "${save_files[*]}")" | xargs rm -rf

通过 ssh:

su - user -c "ssh host find / -mindepth 1 | grep -vE '$(IFS=\| && echo "${save_files[*]}")' | xargs rm -rf"

在上面的 ssh 命令 xargs 正在本地执行。 我需要远程机器上的 xargs 。 即使我将 find 命令放在 '' 括号中,如下所示:

su - user -c "ssh host 'find / -mindepth 1 | grep -vE '$(IFS=\| && echo "${save_files[*]}")' | xargs rm -rf'"

你能试试这个吗?

su - user -c "ssh host 'save_files=test; find / -mindepth 1 | grep -vE "$save_files" | xargs rm -rf'"

或者在切换为root用户之后尝试以下一个?

ssh host 'save_files=test; find / -mindepth 1 | grep -vE "$save_files" | xargs rm -rf'

在远程主机上执行命令的代码:

su - user -c "ssh host 'find / -mindepth 1 | grep -vE '$(IFS=\| && echo "${save_files[*]}")' | xargs rm -rf'"

使用双引号将命令传递给“su -c”,然后使用单引号将命令传递给“ssh”(其中包含双引号)。 但是,引用不支持嵌套,因此 '$(IFS=... ... )' 中的引用实际上终止了 'find' 中的引用。

您可以使用“set -vx”前缀执行相同的操作,以查看扩展

su - owner -c "set -vx ; ssh localhost ...

你会看到

++ IFS='|'
++ echo 'test1|test2'
+ su - owner -c 'set -vx ; ssh localhost '\''set -x ; find /foo -mindepth 1 | grep -vE '\''test1|test2'\'' | xargs rm -rf'\'''
Password: 
+ ssh localhost 'set -x ; find /foo -mindepth 1 | grep -vE test1'
+ 'test2 | xargs rm -rf'
-su: test2 | xargs rm -rf: command not found
+ find /foo -mindepth 1
+ grep -vE test1
find: ‘/foo’: No such file or directory

建议的解决方案:

我无法找到获得三级引用的方法(非常令人沮丧)可能的解决方案可能是创建一个帮助脚本 h.sh,它将执行“ssh”命令,然后使用“su - user”调用帮助脚本'/path/to/helper.sh'

开始另一个答案,再次尝试单线,避免中间脚本。

关键问题是三级引用,而 shell 仅支持两级引用(双引号、单引号)。 我相信可以通过在模式中使用反引号来消除对第三级引用的需要,从而消除将其放入引号中的需要。

IFS=\| P="${save_files[*]}"   su - owner -c "ssh localhost 'set -vx ; find /tmp/xyz -mindepth 1 | grep -vE ${P//|/\\|} | xargs rm -rf'"

该解决方案使用“转义”创建模式 - 参见“($P/|/\|}”,无需引用该模式。如果 save_files 没有魔术字符,则应该可以工作。

笔记:

  1. 请注意,我已将 '/' 替换为 /tmp/xyz,以减少意外复制/粘贴将删除重要数据的更改(已在我的 VM 上发生:-( )。
  2. 'set -vx' 用于调试和故障排除,可以删除

首先连接您的远程系统并运行您需要的 bash 命令,例如 find 和 xargs

ssh root@MachineB 'bash command'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM