1

Мое требование - у меня будет набор команд, которые необходимо выполнить в текстовом файле. Мой скрипт Shell должен читать каждую команду, выполнять и сохранять результаты в отдельном файле.

Вот фрагмент, который выполняет вышеуказанное требование.

while read command
do
    echo 'Command :' $command >> "$OUTPUT_FILE"
    redirect_pos=`expr index "$command" '>>'`       
    if [ `expr index "$command" '>>'` != 0 ];then
        redirect_fn "$redirect_pos" "$command";        
    else  
        $command 
        state=$?
        if [ $state != 0 ];then
                echo "command failed." >> "$OUTPUT_FILE"
        else
        echo "executed successfully." >> "$OUTPUT_FILE"
        fi
     fi
    echo  >> "$OUTPUT_FILE"
done < "$INPUT_FILE"

Пример Commands.txt будет таким ...

tar -rvf /var/tmp/logs.tar -C /var/tmp/ Commands_log.txt
gzip /var/tmp/logs.tar
rm -f /var/tmp/list.txt

Это работает нормально для команд, которые должны быть выполнены на локальной машине. Но когда я пытаюсь выполнить следующие команды ssh, выполняется только 1-я команда.

Вот некоторые команды ssh, добавленные в мой текстовый файл.

ssh uname@hostname1 tar -rvf /var/tmp/logs.tar -C /var/tmp/ Commands_log.txt
ssh uname@hostname2 gzip /var/tmp/logs.tar
ssh .. etc

Когда я выполняю это в кли, он работает нормально. Кто-нибудь может мне помочь в этом?

1 ответ1

1

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

Если вы хотите выполнить его просто с помощью ssh, используйте следующий синтаксис:

ssh localhost -C "echo test; echo blub"

РЕДАКТИРОВАТЬ: Хорошо, я наконец нашел проблему в вашем сценарии. $ command запускает вашу команду в цикле while read, и в то время как локальные команды, такие как "echo" или «tar -f» (-f важна, так как она принимает FILE и не вводит данные из stdin), все работает как Шарм.

С другой стороны, SSH пытается создать "интерактивный" сеанс, в котором ввод с клавиатуры перенаправляется на другой компьютер. Теперь проблема в том, что он читает все "ожидающие данные" из вашего перенаправления «$ INPUT_FILE» и отправляет их на хост ssh.

Вы действительно можете увидеть это поведение. Попробуйте добавить команду вроде:

ssh user@host tee flush.txt

Теперь Tee перенаправляет "остаток" вашего $ INPUT_FILE в файл удаленных хостов «flush.txt». Поэтому в следующий раз, когда мы передадим слово "done", больше ничего не останется для "read".

Чтобы исправить это поведение, вам просто нужно указать $ command, чтобы получить входные данные из /dev /null.

$command < /dev/null

исправит вашу проблему.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .