通过 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 没有魔法人物.
备注:
- 请注意,我已将“/”替换为 /tmp/xyz,以减少更改,意外 copy/paste 将删除重要数据(已在我的 VM 上发生:-( )。
- 'set -vx'用于调试和故障排除,可以删除
我正在尝试使用 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 没有魔法人物.
备注:
- 请注意,我已将“/”替换为 /tmp/xyz,以减少更改,意外 copy/paste 将删除重要数据(已在我的 VM 上发生:-( )。
- 'set -vx'用于调试和故障排除,可以删除