SSH в скрипте Bash - PullRequest
       1

SSH в скрипте Bash

2 голосов
/ 05 июля 2011

У меня есть скрипт, который читает файл строка за строкой и делает вещи, основываясь на том, что он читает. Одна из вещей, которые он делает - это ssh на удаленный сервер и получает некоторую информацию. По какой-то причине это полностью за мной, это останавливает чтение строк из файла.

Сценарий по сути (я вырезал много для упрощения вопроса, так что не волнуйтесь, если он выглядит так, будто ничего не делает):

cat $csv | while read line; do
   shopt -s nocasematch
   for j in "${file_list[@]}"; do
      found=0;
      for i in $(ssh some_server "ls /some_path/${line:0:1}/${line:1:1}/$line*"); do
         if [[ $i =~ .*$j$ ]]; then
            echo "do something";
            found=1;
            break;
         fi;
      done;
      if [[ $found -ne 1 ]]; then
         echo "don't have $j";
      fi;
      if [[ $found -ne 1 && $j == '\.pdf' ]]; then
         getPDF $line ${dest};
      fi;
   done;
   shopt -u nocasematch
done

Этот скрипт запускается только в первой строке CSV. Если я заменю часть скрипта «ssh» чем-то другим, он будет проходить по всем строкам файла. Что дает?

Ответы [ 2 ]

9 голосов
/ 05 июля 2011

ssh потребляет стандартный ввод.Pass -n.

0 голосов
/ 12 сентября 2013

Если вы запускаете команды, которые читают из stdin (например, ssh) внутри цикла, вы должны убедиться, что:

  • Ваш цикл не повторяется по стандартному вводу
  • У вашей команды был перенаправлен stdin:

Бывший:

while read -u 5 -r; do
  ssh "$REPLY" ...
done 5<file

... который, используя bash 4.1 или новее, может быть переписан с автоматическим назначением дескриптора файла следующим образом:

while read -u "$file_fd" -r; do
  ssh "$REPLY" ...
done {file_fd}<file

Последний:

while read -r; do
  ssh "$REPLY" ... </dev/null
done <file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...