[英]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 没有魔术字符,则应该可以工作。
笔记:
首先连接您的远程系统并运行您需要的 bash 命令,例如 find 和 xargs
ssh root@MachineB 'bash command'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.