execução sequencial do comando SSH não funciona no Ubuntu / Bash

1

Minha exigência é que eu tenha um conjunto de comandos que precisam ser executados em um arquivo de texto. Meu script Shell tem que ler cada comando, executar e armazenar os resultados em um arquivo separado.

Aqui está o snippet que faz o requisito acima.

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"

Amostra Commands.txt será assim ...

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

Isso está funcionando bem para comandos que precisam ser executados na máquina local. Mas quando estou tentando executar os seguintes comandos ssh apenas o primeiro comando é executado.

Aqui estão alguns dos comandos ssh adicionados no meu arquivo de texto.

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

Quando estou executando isso em cli, está funcionando bem. Alguém poderia me ajudar nisso?

    
por kumar 20.05.2014 / 10:56

1 resposta

1

Não tenho certeza se recebo o problema corretamente. Mas basta gerar o script no lado local, copiá-lo via scp e depois executá-lo com o ssh deve ser muito mais fácil.

Se você quiser executá-lo com o ssh, use esta sintaxe:

ssh localhost -C "echo test; echo blub"

EDITAR : Ok, finalmente encontrei o problema no seu script. O comando $ está executando o seu "comando" dentro do loop "while read", e enquanto comandos locais como "echo" ou "tar -f" (o -f é importante pois pega um FILE e nenhuma entrada de stdin) tudo funciona como um charme.

Por outro lado, o

SSH tenta criar uma sessão "interativa" onde a entrada do seu teclado é encaminhada para a outra máquina. O problema agora é que ele lê todos os "dados de espera" do redirecionamento "< $ INPUT_FILE" e os envia para o host ssh.

Você pode realmente ver esse comportamento. Tente adicionar um comando como:

ssh user@host tee flush.txt

Tee agora está redirecionando o "resto" de seu $ INPUT_FILE para o arquivo de hosts remotos "flush.txt". Então, da próxima vez que passarmos "pronto", não há mais nada para consumir para "ler".

Para consertar este comportamento, você simplesmente tem que dizer $ command para obter a entrada de algo como / dev / null.

$command < /dev/null

consertará seu problema.

    
por 20.05.2014 / 11:06