Copie sobre ssh e execute comandos em uma sessão [duplicada]

19

Aqui está o meu script de sincronização:

ssh [email protected] /etc/init.d/some_service stop
scp [email protected]:/var/some_service/events ./events
scp ./new_data [email protected]:/var/some_service/new_data
ssh [email protected] /etc/init.d/some_service start

Como você pode ver, ele interrompe o serviço, executa algumas cópias com o scp e inicia o serviço de volta.

O problema: "custa" 4 conexões ssh "semelhantes" em sequência.

Existe alguma maneira de fazer todo o trabalho, usando uma conexão ssh física?

    
por Arenim 06.12.2012 / 13:09

3 respostas

24

Você pode considerar usar o compartilhamento de conexão ssh:

Host *.some-domain
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p

Você se conecta apenas uma vez ao seu destino e coloca o processo ssh em segundo plano. Então você executa os outros comandos e finalmente mata o primeiro processo.

Em alternativa, você pode tentar encapsular várias ações em uma única conexão ssh.

Por exemplo, imagine que você tenha um diretório:

 mycommands
 |
 +- run
 +- new_data

Em seguida, você pode compactar esses dados em um tar e enviá-los ao seu script:

tar cf - -C mycommands . | ssh localhost 'D='mktemp -d'; tar xf - -C $D; $D/run'

Agora, o script run pode acessar todos os seus dados de entrada (aqui temos apenas new_data , como no seu exemplo). Para ficar com o seu exemplo, aqui está o script run :

#!/bin/sh
BASE='dirname $0'

/etc/init.d/some_service stop
cat /var/some_service/events

mv $BASE/new_data /var/some_service/new_data
/etc/init.d/some_service start

rm -rf $BASE

Então, agora você só precisa salvar o arquivo events :

tar cf - -C mycommands . | ssh localhost 'D='mktemp -d'; tar xf - -C $D; $D/run' >./events

e, mais geralmente, você pode ter seu script run produzindo um tar e, em seguida, canalizando ssh para o TAR para descompactá-lo localmente.

    
por 06.12.2012 / 13:28
4

Você pode mover essa lógica para um script que é executado no servidor de destino e, em seguida, executá-lo com um único comando SSH. Presumivelmente, isso não é ideal, caso contrário, você já teria feito isso:)

Você pode reduzir o custo de abrir uma nova conexão SSH usando uma conexão mestre SSH. Isso significa que seu primeiro comando SSH abrirá uma nova conexão, como de costume. As conexões subseqüentes ao mesmo servidor reutilizarão essa conexão existente, economizando, assim, a sobrecarga de criação de três conexões adicionais.

Há um bom guia para configurar isso aqui: link

    
por 06.12.2012 / 13:15
1

isso pressupõe que, o servidor local confie no servidor remoto para executar o comando sem a senha, caso contrário, ele não funcionará quando você estiver executando uma chamada conexão sem cabeça, sem nenhuma maneira de fornecer entrada

ssh remoteserver "/etc/init.d/some_service stop; scp /var/some_service/events localhost:${PWD}/events; scp localserver:${PWD}/new_data /var/some_service/new_data; /etc/init.d/some_service start"

tudo fora do código acima precisa estar em uma linha contígua no seu terminal, ou se você estiver executando de dentro de um script, tudo isso deve ser um comando, não separado por feeds de linha.

se você tiver um par de chaves confiável do servidor remoto para o servidor local, não vejo motivo para que isso não funcione.

    
por 07.12.2012 / 00:30

Tags