Цикл while в команде ssh

У меня есть требование подключиться к удаленному компьютеру, а затем получить info и переход к циклу while .

ssh rao@172.168.1.123 "find ~/listfile/ -iname \"*log*\" |while read line; do cat $line; done"

Приведенные выше команды печатают пустые строки. Я попробовал найти сам, чтобы проверить команду, и она действительно работает, и выводит список файлов.

ssh rao@172.168.1.123 "find ~/listfile/ -iname \"*log*\""

Как посмотреть содержимое найденных файлов?

0
20.09.2017, 17:38
2 ответа

Вы должны использовать только find, если вы собираетесь перечислить файлы с совпадающим именем, где вы ssh на удаленном сервере, и добавлять только файлы, если -type f.

ssh USER@HOST 'find ~/listfile/ -type f -iname "*log*" '

Если вам нужно catсодержимое найденных файлов, используйте findс catследующим образом.

ssh USER@HOST 'find ~/listfile/ -type f -iname "*log*" -exec cat {} +'

Ваша конкретная проблема заключается в том, что $lineрасширяется локальной оболочкой, поскольку оно заключено в двойные кавычки. Но в любом случае ваш подход - это неправильный способ перебора результатов find. См. Почему зацикливание вывода find является плохой практикой? для получения подробной информации.

1
28.01.2020, 04:39

I know it won't strictly answer your question but will surely solve your problem in a very classy way.

Вместо описания вашей команды в строке SSH напишите как Bash функцию[1] :

function foo() { while true; do echo bar; done; } 

Затем запустите команду SSH , используя declare встроенную команду [2] , а затем вызовите функцию Bash :

ssh example.com "$(declare -f foo); foo;"

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

Взрыв! Вы можете значительно упростить свою строку SSH без необходимости копировать сценарий оболочки на удаленную машину.

0
28.01.2020, 04:39

Теги

Похожие вопросы