Использование bash sshpass + openshh для запуска команд в цикле FOR - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь проверить наличие некоторых файлов в папке нестандартной глубины внутри ZIP-файлов на нескольких серверах, расположенных в списке, чтобы в итоге запустить его в скрипте bash.

Я былВ состоянии выполнить команду на определенном сервере (IP) и получить вывод, проблема началась при попытке использовать текстовый файл списка серверов.

for HOST in $(cat serversList.txt)

do

"sshpass -p '*******' ssh osboxes@$HOST -o StrictHostKeyChecking=no find /home/osboxes/Desktop/script -mindepth 1 -maxdepth 7 -iname '*.zip'" -exec "unzip -l {} \; | grep '\.zip\|filename*' >$(hostname)_out.t**strong text**xt 2>$(hostname)_error.txt"

done

Я считаю, что я не использую один /правильные двойные кавычки (не был уверен, почему попытка запуска напрямую по IP работала с ", а не с").

Я просто не настолько знаком с bash, чтобы знать, как объединять выражения, чтобы они соотносились скоманда (например, использование круглых скобок, которые, как я понял, неприменимы в цикле for).

В основном я ожидаю, что вывод и ошибка будут отправлены в файлы вместе с именем хоста машины, на которой он работал. В настоящее время яполучаю ошибку -

bash: sshpass -p '*******' ssh osboxes@10.0.0.25 -o StrictHostKeyChecking=no find /home/osboxes/Desktop/script -mindepth 1 -maxdepth 7 -iname '*.zip': No such file or directory.

Мне кажется, что не удается извлечь ZIP для поиска внутри, я просто не знаю, как его исправить.

Совет hБудем благодарны:)

Обновление: после ответа @chepner, в конце концов я дошел до этого, запустив в оболочке:

while IFS= read -r host; do sshpass -p '*******' ssh osboxes@"$host" -o StrictHostKeyChecking=no \ "find /home/osboxes/Desktop/script -mindepth 1 -maxdepth 7 -iname \"*.zip\" -exec unzip -l {} \; | grep \"\.zip\|filename*\" >"$(hostname)_out.txt" 2>"$(hostname)_error.txt"; done <serversList.txt

Я пытался избежать того, что мне показалось релевантным, дваждыкавычки (") кода и удаление одного" после find -exec , чтобы устранить отсутствующий аргумент для exec error.

Однако после нажатия введите для вышеупомянутого, Я получаю новую строку (>) на следующей строке, и я не могу понять, почему ..

Это содержимое serversList.txt : 10.0. 0.25 10.0.0.26

Я полагаю, что синтаксис в сочетании с фактом превышения ssh приводит к тому, что это происходит, но мои навыки работы с оболочкой еще не достаточно сильны, чтобы увидеть, чего я здесь упускаю.

Обновление 2-

В конце концов я сделал это с:

while IFS= read -r host; do sshpass -p 'tds654321' ssh osboxes@"$host" -o StrictHostKeyChecking=no \ "find /home/osboxes/Desktop/SecPageProj/testfiles -mindepth 1 -maxdepth 7 -iname *.zip -exec unzip -l {} \;|grep '\.zip\|SecurityPage\|ERTSOC'" >$(hostname)_out.txt 2>$(hostname)_error.txt ;done <serversList.txt

Спасибо за руководство и вдохновение:)

Ответы [ 2 ]

0 голосов
/ 13 октября 2019
while IFS= read -r host; do sshpass -p 'tds654321' ssh osboxes@"$host" -o StrictHostKeyChecking=no \ "find /home/osboxes/Desktop/SecPageProj/testfiles -mindepth 1 -maxdepth 7 -iname *.zip -exec unzip -l {} \;|grep '\.zip\|SecurityPage\|ERTSOC'" >$(hostname)_out.txt 2>$(hostname)_error.txt ;done <serversList.txt
0 голосов
/ 07 октября 2019

Вам нужно указать только команду, которая должна выполняться на удаленном хосте, а не всю локальную командную строку.

(Также см. Bash FAQ 001 , чтобы узнать, как правильноперебрать строки файла.)

while IFS= read -r host; do
  sshpass -p '*******' \
    ssh osboxes@"$host" -o StrictHostKeyChecking=no \ 
    'find /home/osboxes/Desktop/script
       -mindepth 1
       -maxdepth 7
       -iname "*.zip"
       -exec "unzip -l {} \; |
     grep "\.zip\|filename*" >"$(hostname)"_out.txt 2>"$(hostname)"_error.txt'
done < serversList.txt
...