Eu li vários posts aqui sobre esse tópico, mas cada solução que encontro parece ser uma linha onde você executa um comando.
Estou criando um script onde faço ssh para vários hosts diferentes, um após o outro. O objetivo é fazer ssh para uma máquina, executar alguns comandos locais, executar um script, esperar que ele termine e então sair da sessão ssh e passar para a próxima.
Porém, quando uso o comando "exit" ele não funciona e simplesmente sai do script por completo.
Responder1
Acho que seu script não está saindo da sessão do shell porque você o está chamando diretamente com ./exit.sh
. Você deveria source
fazer isso.
Uma exit
instrução em seu script fechará a sessão do shell.
$ source exit.sh
# or
$ . exit.sh
O source
builtin executa seu script nocontexto atual do shell, enquanto ./exit.sh
lança umnova conchapara executá-lo.
Responder2
Você já tentou colocar os comandos em um arquivo e usar cat com ele ou EOF
ssh -t [email protected] << EOF
command1
command2
exit
EOF
Responder3
Eu recomendo observar pssh
o que você está tentando realizar - ele permite que você lide facilmente com as nuances de abertura/fechamento de conexões entre máquinas e pode até mesmo executar em paralelo para reduzir o tempo de execução.
Ele ainda é usado ssh
como protocolo de transporte, portanto é obviamente tão seguro quanto uma ssh
conexão em loop.
Responder4
Geralmente você pode fazer um for
loop ssh
sem problemas.
$ for srv in 192.168.88.138; do echo $srv:; ssh $srv uptime; done
192.168.88.138:
13:27:25 up 30 days, 8:42, 1 user, load average: 4.15, 4.06, 4.06
Então, neste caso, corri uptime
para o outro lado. Você pode substituir uptime
pelo que deseja executar. O que quer que você coloque lá é onde a saída precisa estar. uptime
sai assim que imprime sua saída, mas se você estiver escrevendo o script, pode ser necessário garantir que ele saia para que o for
loop possa continuar.
Se você estiver fazendo algo complicado, recomendo criar o script em um arquivo separado e, em seguida, scp
enviá-lo para o servidor em que deseja executá-lo e, em seguida, ssh para executá-lo. Tentar inserir algo complicado no ssh por meio de citações e escapes é mais desafiador do que normalmente vale a pena.
Já fiz isso centenas de vezes e funciona bem quando você deseja que as coisas sejam executadas em um servidor por vez. Se você quiser que as coisas funcionem em paralelo, existem outras opções, mas eu daria uma olhadaansibleprimeiro.