последовательное выполнение команды 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, он работает нормально. Кто-нибудь может мне в этом помочь?

3
задан Matteo
26.03.2023 10:32 Количество просмотров материала 3189
Распечатать страницу

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 2023-03-27 18:20

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх