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

Как использовать faketime в bash?
Bash" time " встроенный в строку не выполняется
Добавить псевдоним.mylongwebsiteaddress в конец строки в cygwin
Загрузка нескольких файлов с ftp-сервера с помощью сценария bash
Как восстановить удаленную историю в терминале с помощью #history-c
Добавление пользовательских строк в файл с помощью shell-скрипт
Копировать всех пользователей.история bash на одном дыхании
Как объединить строки в сценарий bash?
Как остановить запуск jar-файла в скрипте bash через 5 минут и запустить следующий?
Как найти все софт-ссылки (символьные ссылки) в текущем каталоге?
Почему xmessage сообщает, что пользователь нажал "x", не отображая сообщение при запуске из cron?
Как установить NIC в беспорядочном режиме на Mac book air?
Расширение Brace, похоже, не работает в Bash 3.2.51 на Mac OS X
Сочетания клавиш Bash, использующие Alt, не работают на Mac
Как закодировать дефис в открытой команде терминала Bash?

последовательное выполнение команды SSH не работает в Ubuntu / Bash

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

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

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"

Sample 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

это прекрасно работает для команд, которые должны быть выполнены в локальной машине. Но когда я пытаюсь выполнить следующие команды СШ выполняется только 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

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

5
задан Matteo
источник

1 ответов

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

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

ssh localhost -C "echo test; echo blub"

EDIT: Ладно, я наконец-то нашел проблему в твоем сценарии. $команда работает ваша "команда" внутри ", а читать" петли, и в то время как местные команды, как "эхо" или "тар-Ф" (К -ф Как принимать файл и ввода из stdin) все работает как шарм.

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

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

ssh user@host tee flush.txt

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

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

$command < /dev/null

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

1
отвечен SaschaZorn 2014-05-27 00:51:28
источник

Другие вопросы bash linux ssh ubuntu