Como executar um script depois de conectado com o ssh

3

Eu ouvi várias respostas de erros e acertos e ainda não sei se é possível. Eu ssh para um servidor, em seguida, quero executar um bloco de script.

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 doesn't try to ssh to itself
    continue
 fi
    echo "Connecting to - $server"
    ssh "$server"   #SSH login
    echo Connected to "$serverName"
    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 quero executar o bloco de código depois de sshing nos servidores.

    
por mkrouse 16.07.2013 / 16:39

3 respostas

2

O problema que você está tendo atualmente é que a conexão SSH "pausa" o script e o script é retomado com a linha echo Connected to "$serverName" somente após a saída da sessão SSH.

A meu ver, você tem duas opções. (Provavelmente há mais, mas estes são os dois que eu posso pensar atualmente.)

A primeira opção é usar expect para iniciar uma sessão SSH que você pode controlar por meio do script, enviando comandos de um lado para o outro do script mestre para a sessão SSH. A segunda opção é colocar o bloco que você deseja executar remotamente no servidor remoto como um script diferente e executar o SSH de maneira não interativa: ssh $server $script-to-run .

    
por 16.07.2013 / 16:53
2

Se você estiver absolutamente convencido de que deseja estruturá-lo como um único script, use um HEREDOC quando você abre sua conexão com o servidor ssh remoto.

Por exemplo:

$ ssh user@server << EOT

...
commands
...

EOT
    
por 16.07.2013 / 20:50
1

Como alternativa, faça um simples eco no pipe e, em seguida, execute tudo a partir do stdin.

echo " \
uname -a; \
whoami; \
uname " \
| ssh -l root localhost 'cat | sh -'
    
por 16.07.2013 / 23:54

Tags