У меня есть требование подключиться к удаленному компьютеру, а затем получить 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*\""
Как посмотреть содержимое найденных файлов?
Вы должны использовать только 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 является плохой практикой? для получения подробной информации.
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 без необходимости копировать сценарий оболочки на удаленную машину.