combine ssh e scp em uma sessão ssh

combine ssh e scp em uma sessão ssh

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 ssh/scpchamada? O problema que tenho é combinar a cópia de arquivos com a execução de comandos, o que deve ser feito de forma intercalada. Estava esperando algo como:

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

Não se trata de sintaxe (eu poderia escrever uma função como essa), mas de tudo que acontece na mesma sshsessão

Responder1

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

Há um garfo extremamente antigossh-xfer. Observe que mesmo os desenvolvedores desta ferramenta enfatizam que sua solução é “hackeada” e muito antiga, então você não deve usá-la. A última versão SSH que foi corrigida para poder ser usada 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/handshakes feitos entre hosts, você pode procurar algum tipo de ferramenta de provisionamento/orquestração.Ansibleparece ser a maneira mais fácil de realizar a tarefa sem muita configuração adicional enquantoSalpode ser o mais rápido.

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

ATUALIZAÇÃO: Se você precisar enviar e extrair muitos arquivos com alguns scripts adicionais em execução entre essas transferências, quase qualquer ferramenta de provisionamento (Chef, Puppet, Salt, Ansible) fará a coisa mais rapidamente do que o ssh/scp simples.

Responder2

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 habilitá-lo:

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

ControlMasterpermite o compartilhamento de múltiplas 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.

ControlPathespecifica o caminho onde as conexões são armazenadas.Certifique-se de que esse caminho existe!Ou seja, crie o diretório (tomadasaqui, mas nomeie como quiser) manualmente.

ControlPersistespecifica quanto tempo a conexão durará após você desconectar. Aceita tempo em segundos.

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

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

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

PS Às vezes (por exemplo, se você mudou a rede) suas conexões ssh existentes são interrompidas e novas não são estabelecidas porque o arquivo com a conexão existe. Neste caso basta acessar ~/.ssh/socketse excluir o arquivo necessário manualmente.

Responder3

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

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


  • O cat "$TDIR/file1"comando é apenas um exemplo de como acessar os arquivos recebidos;
  • Use tar com a opção -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 remotamente como...tar -xf - -C "$TDIR"; bash "$TDIR/script.sh"'

Responder4

No seu script, assim que a primeira linha for executada ...

ssh host command1

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

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

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

informação relacionada