通过 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'"

首先连接您的远程系统,然后 运行 bash 命令,如 find 和 xargs

ssh root@MachineB 'bash command'

你能试试这个吗?

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'"

解决方案使用 'escapes' 创建模式 - 请参阅“($P/|/\|}”,无需引用模式。如果 save_files 没有魔法人物.

备注:

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