удалить файлы через ssh и xargs - PullRequest
       18

удалить файлы через ssh и xargs

0 голосов
/ 21 октября 2019

Я пытаюсь удалить файлы через ssh, используя find и xargs. На локальной машине команда работает корректно. Я также использую список исключений.

Я пытался изменить скобки между '' и "", но он не работает.

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 на удаленной машине. Даже я поставил команду поиска в скобках '', как показано ниже:

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

Ответы [ 4 ]

0 голосов
/ 27 октября 2019

Начало другого ответа, повторная попытка однострочного, избегая промежуточного сценария.

Ключевая проблема - трехуровневое цитирование, тогда как оболочка поддерживает только двухуровневое цитирование (двойная кавычка, одинарная кавычка). Я полагаю, что можно было бы устранить необходимость в 3-м уровне цитирования, используя обратную кавычку в шаблоне, избавляя от необходимости помещать его в кавычки.

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

Решение создать шаблон с помощью «escape»- см. '($ P / | / \ |}', устраняя необходимость заключать шаблон в кавычки. Должно работать, если в файле save_files нет магических символов.

Примечания:

  1. Заметьте, что я заменил '/' на / tmp / xyz, чтобы уменьшить изменение, случайное копирование / вставка удалит важные данные (уже произошло на моей виртуальной машине :-().
  2. 'set -vx'предназначен для отладки и устранения неполадок и может быть удален
0 голосов
/ 21 октября 2019

Можете ли вы попробовать это?

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'
0 голосов
/ 21 октября 2019

Код для выполнения команды на удаленном хосте:

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'

0 голосов
/ 21 октября 2019

Сначала подключите вашу удаленную систему и выполните команду bash, как вам нужно, например find и xargs

ssh root@MachineB 'bash command'
...