Retendo a sessão SSH no script bash

1

Eu tenho um script bash que faz um loop em uma lista de servidores, executa alguns comandos remotos via SSH e grava a saída desses comandos em um arquivo local. Para cada comando que eu executo no servidor remoto, abro uma nova sessão SSH. Existe uma maneira que apenas uma sessão SSH permanece aberta para um servidor, e que eu posso executar vários comandos que a saída posso redirecionar para um arquivo local?

    
por Tom_13 27.10.2009 / 11:51

5 respostas

2

Você deseja examinar a configuração ControlMaster do SSH. Isso permite que você crie uma única conexão SSH e, em seguida, tenha todas as outras conexões SSH para o mesmo servidor multiplex sobre essa conexão. Muito útil.

    
por 27.10.2009 / 11:59
1

Nota: Quando você diz arquivo local, eu não tenho certeza se você quer dizer local a máquina que você apenas ssh'd em, ou se você quer dizer local para a máquina, inicia a sessão ssh.

Push vs Pull:
Parece que isso pode não ser a ferramenta certa, talvez você só queira usar o cron em cada máquina local? Se forem necessárias informações do mestre, você poderá fazer com que a tarefa cron busque um arquivo do servidor. Isso seria mais um método pull, o ssh é o que eu chamaria de método push. Eu não posso dizer qual é o melhor para a sua situação, mas isso pode ser algo para se pensar.

Executar vários comandos:
Eu não entendo se você quer dizer manter a sessão aberta para cada iteração dos vários comandos, ou apenas manter sempre aberta. Se for o primeiro, você pode usar apenas ponto-e-vírgula entre comandos, ou & & para fazer isso, o próximo comando só será executado se o primeiro funcionar. Por exemplo:

#bar echoed only if foo exists and can be read
ssh myServer 'cat foo && echo bar'
ssh myServer 'cat foo; echo bar'

Você também pode fazer coisas como as seguintes se quiser especificar o uso das coisas em um shell:

ssh myServer "bash -c 'cat foo && echo bar'"

Por último, você pode sempre colocar o script em cada servidor e apenas executá-lo.

    
por 27.10.2009 / 12:38
1

A ferramenta "esperar" também pode fazer o que você quer, mas envolve escrever tcl.

    
por 27.10.2009 / 13:16
1

Para expandir o uso do ControlMaster, aqui está um exemplo um pouco mais concreto:

CONTROL=/tmp/ssh-control-'date +%s'-$RANDOM
ssh -o BatchMode=yes -NfM -S $CONTROL &
MASTERPID=$?

ssh -o BatchMode=yes -S $CONTROL command1 > outfile1
ssh -o BatchMode=yes -S $CONTROL command2 > outfile2

kill $MASTERPID

Isso não é testado, mas deve dar uma ideia geral correta.

    
por 27.10.2009 / 14:18
0

Você pode executar vários comandos em sequência iniciando um shell no sistema remoto e passando os comandos:

ssh server "echo this is; all in one session"

passará automaticamente a string entre aspas por meio de um shell remoto. Cuidado com regras de citação de shell, embora!

    
por 27.10.2009 / 12:39