Код для выполнения команды на удаленном хосте:
su - user -c "ssh host 'find / -mindepth 1 | grep -vE '$(IFS=\| && echo "${save_files[*]}")' | xargs rm -rf'"
Использует двойные кавычки для передачи команды в 'su -c' и затем одинарные кавычки для передачи команды в 'ssh'(которые содержат двойные кавычки). Однако цитирование не поддерживает вложение, поэтому кавычка в '$ (IFS = ... ...)' фактически завершает кавычку в 'find'.
Вы можете выполнить то же самое с помощью 'установите префикс -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'