Mensagem de pseudo-terminal no script

0

Este é o meu script

#!/bin/bash
exec < filelist.txt
    while read updatedfile oldfile; do
    #   echo updatedfile = "$updatedfile" #use for troubleshooting
    #   echo oldfile = "$oldfile" #use for troubleshooting
               if [[ ! $updatedfile =~ [^[:space:]] ]] ; then  #empty  line exception
                continue # empty line exception
               fi
               if [[ ! $oldfile =~ [^[:space:]] ]] ; then  #empty line exception
                continue # empty line exception
               fi 
            echo Comparing $updatedfile with $oldfile
            if diff "$updatedfile" "$oldfile" >/dev/null ; then
                echo The files compared are the same. No changes were made.
            else
                echo The files compared are different.
                cp -f -v $oldfile /infanass/dev/admin/backup/'uname -n'_${oldfile##*/}_$(date +%F-%T)
                cp -f -v $updatedfile $oldfile 
            fi          
    done
#go through rest of servers from list
while read server <&3; do   #read server names into the while loop    
serverName=$(uname -n)
 if [[ ! $server =~ [^[:space:]] ]] ; then  #empty line exception
    continue
 fi   
 echo server on list = "$server"
 echo server signed on = "$serverName"
 if [ $serverName == $server ] ; then #makes sure a server doesnt try to ssh to itself
    continue
 fi
    echo "Connecting to - $server"
    ssh "$server"  #SSH login
    exec < filelist.txt
    while read updatedfile oldfile; do
    #   echo updatedfile = $updatedfile #use for troubleshooting
    #   echo oldfile = $oldfile   #use for troubleshooting
               if [[ ! $updatedfile =~ [^[:space:]] ]] ; then  #empty line exception
                continue # empty line exception
               fi
               if [[ ! $oldfile =~ [^[:space:]] ]] ; then  #empty line exception
                continue # empty line exception
               fi 
            echo Comparing $updatedfile with $oldfile
            if diff "$updatedfile" "$oldfile" >/dev/null ; then
                echo The files compared are the same. No changes were made.
            else
                echo The files compared are different.
                cp -f -v $oldfile /infanass/dev/admin/backup/'uname -n'_${oldfile##*/}_$(date +%F-%T)
                cp -f -v $updatedfile $oldfile 
            fi          
    done
done 3</infanass/dev/admin/servers.txt

Eu recebo o erro quando tento enviar o ssh para minha lista de servidores.

Pseudo-terminal will not be allocated because stdin is not a terminal.

Em seguida, meu script não faz corretamente o ssh e compara os arquivos do servidor recém-logado .. Alguém sabe por que isso acontece?

    
por mkrouse 15.07.2013 / 20:36

1 resposta

1

Você está esperando que todos os comandos após ssh "$server" sejam executados dentro do ssh? Não é assim que funciona. ssh com um nome de host e nenhum outro argumento inicia uma sessão interativa. Depois que ele sair, o script continuará com o próximo comando ( exec < filelist.txt ). Isso não é um comando remoto dentro do ssh; o ssh é feito e desaparece quando o comando é alcançado. Isso é apenas uma execução sequencial normal do script que contém.

Sessões ssh interativas com stdin redirecionado são um tanto incomuns. É por isso que você recebe um aviso. (Para eliminar o aviso, você pode usar -t ou -T )

Se você deseja passar um script grande por uma conexão ssh e executá-lo remotamente, pode fazê-lo com um documento , assim:

ssh "$server" sh <<EOF
your big script here...
EOF

Certifique-se de considerar cuidadosamente quais variáveis devem ser expandidas pelo script local e quais devem ser expandidas durante a execução do script remoto. Um $ desprotegido no heredoc será expandido localmente. Para protegê-lo para que o shell remoto veja um $ , use \$ . Se você quiser que todos sejam protegidos, altere <<EOF para <<'EOF' .

    
por 15.07.2013 / 22:20