Pergunta

meu problema é o seguinte:Estou escrevendo um script cujo objetivo é executar determinados scripts em diferentes servidores em paralelo.Ou seja, quero entrar em um servidor remoto, digitar a senha (isso não é negociável porque chefe), iniciar o script, fechar a conexão enquanto o script ainda está em execução, conectar-me ao próximo servidor e fazer toda a dança novamente.Como eu faço isso?

Foi útil?

Solução

Supondo que bash seja o shell de destino em todas as máquinas remotas, você poderia fazer isso para uma máquina:

ssh user@host /path/to/script '&>/dev/null' '</dev/null' '&' disown

Para várias máquinas, você poderia criar um script assim:

hosts='user1@host1 user2@host2'

for host in $hosts
do
  ssh $host /path/to/script '&>/dev/null' '</dev/null' '&' disown
done

Isso deve apenas fazer com que você digite as senhas.

Como alternativa, se você puder usar a mesma senha para várias máquinas, recomendo procurar ClusterSSH.Com isso você pode logar em múltiplas máquinas simultaneamente e digitar comandos para serem enviados a todas elas em uma única janela ou individualmente em cada janela do xterm.Isso evitaria que você digitasse a mesma senha repetidamente.Uma vez logado, você pode executar o comando acima (sem o ssh user@host parte) e sair.

Atualizar

Algumas reflexões extras aqui.Primeiro, provavelmente não é uma boa ideia descartar completamente a saída do script, já que você nunca saberá o que aconteceu se algo der errado.Você poderia simplesmente colocá-lo em um arquivo para ver mais tarde, substituindo '&>/dev/null' com '&>filename'.Outra abordagem seria fazer com que a máquina remota envie por e-mail para você (desde que esteja configurada corretamente para fazer isso):

host=user@host
ssh $host \(/path/to/script '2>&1' \| mail -s "$host output" me@me.com\) \
  '&>/dev/null' '</dev/null' '&' disown

Segundo, se o script estiver no host local, você poderá copiá-lo e executá-lo em um comando.Assume um script de shell, se não apenas substituir sh com o intérprete correto)

</path/to/script ssh user@host \
  cat \>script \; sh ./script '&>/dev/null' '</dev/null' '&' disown

Outras dicas

Após o login você pode usar o utilitário screen para iniciar uma nova sessão de terminal e posteriormente desconectar-se dela, exemplo:

[user@local]$ ssh machine
[user@machine]$ screen -S my_session
# you are now switched to new terminal session named "my_session"
# now you can start long operation, that you want to keep in background
[user@machine]$ yes
# press "Ctrl-a d" to detach, you will go back to original session
[detached from 11271.my_session]
# now you can leave ssh (your session with "yes" running will be kept in background)
# to list existing screen sessions run:
[user@machine]$ screen -list
There is a screen on:
11271.my_session    (Detached)
1 Socket in /var/run/screen/S-user.
# to re-attach use -r
[user@machine]$ screen -r my_session
# you will be back to session with "yes" still running (press Ctrl-C to stop it)

Depois de entender como a tela funciona, você pode tentar criar um script;é assim que você inicia a sessão de tela no estado desanexado executando my_command:

$ screen -d -m my_command

expect pode automatizar isso facilmente:

#!/usr/bin/expect -f

set hosts {your list of hosts goes here ...}
foreach host $hosts {
    spawn ssh -t user@$host screen ./script.sh
    expect "assword:"
    send -- "secret\r"
    sleep 1
    send -- "d"
    expect eof
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top