combina ssh e scp em uma sessão ssh [duplicata]

4

Eu tenho um script parecido com o seguinte:

ssh host command1
scp file1 host:/tmp
ssh host command2

Existe uma maneira de combinar todos eles em uma chamada ssh/scp ? O problema que tenho é combinar copiar arquivos com comandos de execução, o que deve ser feito intercalado. Estava esperando por algo como:

ssh_sometool host -c command1 -cp file1 /tmp -c command2

Não é sobre a sintaxe (eu poderia escrever uma função como essa), é sobre tudo que acontece dentro da mesma ssh session

    
por Chirlo 23.11.2017 / 13:15

5 respostas

4

Em primeiro lugar, não há uma maneira direta ou padrão de fazer o que você quer. Além disso, deixe-me esclarecer: não há como fazer o que você quer com um cliente ssh padrão .

Existe um fork muito antigo ssh-xfer . Note que mesmo os desenvolvedores desta ferramenta enfatizam que sua solução é "hackish" e muito antiga, então você não deve usá-la. A última versão do SSH que foi corrigida por ser utilizável com esta ferramenta é OpenSSH-3.8.1p1 (no Arch Linux, a versão atual é OpenSSH_7.6p1 ).

Se for importante manter as coisas rápidas minimizando o número de conexões / apertos de mão entre os hosts, você poderá procurar algum tipo de ferramentas de provisionamento / orquestração. O Ansible parece ser a maneira mais fácil de realizar a tarefa sem muita configuração adicional enquanto Sal pode ser o mais rápido.

De qualquer forma, tanto o Ansible quanto o Salt utilizam conexões adicionais para fazer as coisas funcionarem e eu não tenho certeza se você ganhará alguma coisa em termos de desempenho usando-as em vez da combinação ssh / scp.

ATUALIZAÇÃO: Se você tiver que empurrar e puxar muitos arquivos com alguns scripts adicionais sendo executados entre essas transferências, praticamente qualquer ferramenta de provisionamento (Chef, Puppet, Salt, Ansible) fará a coisa mais rápido que o ssh / scp.

    
por 23.11.2017 / 14:37
3

O SSH permite manter uma sessão ativa por um tempo após a desconexão, para que você não precise iniciar a conexão na próxima vez. Aqui estão as opções de configuração do ssh para ativá-lo:

Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 30

ControlMaster permite o compartilhamento de várias sessões em uma única conexão de rede. Quando definido como auto , cada nova tentativa verifica se a respectiva conexão existe e a utiliza ou cria uma nova conexão.

ControlPath especifica o caminho onde a conexão é armazenada. Certifique-se de que este caminho exista! Isto é, crie o diretório ( sockets aqui, mas nomeie-o como quiser) manualmente.

ControlPersist especifica quanto tempo a conexão permanece após você ter se desconectado. Aceita o tempo em segundos.

Para mais esclarecimentos sobre as opções, use man ssh_config .

Depois de adicioná-los ao seu ~/.ssh/config , apenas uma sessão será aberta para esses três comandos.

No meu computador, ele dá aceleração 5x: 100 conexões em fila para algum trabalho de host (próximo) em 30s sem sessões persistentes e apenas 5-6s com elas.

P.S. Às vezes (por exemplo, se você alterou a rede), as conexões ssh existentes fazem a interrupção e as novas não serão estabelecidas, porque o arquivo com a conexão existe. Nesse caso, vá para ~/.ssh/sockets e exclua o arquivo necessário manualmente.

    
por 23.11.2017 / 16:54
1

Você pode juntar e passar todos os seus arquivos através da entrada padrão ssh e recebê-los em sua sessão remota, quero dizer algo como isto:

tar -cf - file1 file2 | ssh host 'TDIR='mktemp -d'; tar -xf - -C "$TDIR"; cat "$TDIR/file1"; command1; command2 ...'


  • O comando cat "$TDIR/file1" é apenas um exemplo de como acessar seus arquivos recebidos;
  • Use o tar com os controles -j ou -J no lado local e remoto para passar seus arquivos compactados;
  • Você pode colocar todos os seus comandos em um script bash, incluí-lo em seu arquivo e executar no lado remoto como ...tar -xf - -C "$TDIR"; bash "$TDIR/script.sh"'
por 23.11.2017 / 14:26
0

Tente isso

cat file1 | ssh host 'command1 && cat >> /tmp/file1 && command2'
    
por 23.11.2017 / 15:43
-1

No seu script, quando a primeira linha for executada ...

ssh host command1

A execução é entregue para ssh + seu segundo comando (scp) só será executado quando o comando1 terminar. Uma maneira de executá-los em paralelo é o background de cada tarefa, assim ...

ssh host command1 &
scp file1 host:/tmp &
ssh host command2 &

Então agora todas as três tarefas são executadas em segundo plano, simultaneamente.

    
por 23.11.2017 / 13:22

Tags