Chamadas de script bash esperam script com conexão SSH principal

2

Estou tentando escrever um script bash que chama um script expect para estabelecer uma conexão SSH principal a ser usada para os comandos SSH restantes no script bash.

~ / .ssh / config:

ControlMaster auto
ControlPath ~/.ssh/control-%r@%h:%p

upload.sh:

#!/usr/bin/bash

expect -f /home/Dave/bin/ssh.exp

scp /home/Dave/bin/test [email protected]:/root/test

ssh [email protected] "echo 'Test' >> /root/test"

ssh -O exit [email protected]

ssh.exp:

#!/usr/bin/expect -f

# Enable some diagnostic output
exp_internal 1

spawn /usr/bin/ssh -M -N [email protected]

expect {
    -re ".*yes.*no.*" {
        exp_send "yes\r"
        exp_continue
    }
    -re ".*password.*" {
        exp_send "OMGSECRET\r"
    }
}

$ bin/upload.sh
spawn /usr/bin/ssh -M -N [email protected]
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {5212}
Gate keeper glob pattern for '.*yes.*no.*' is ''. Not usable, disabling the performance booster.
Gate keeper glob pattern for '.*password.*' is '*password*'. Activating booster.

expect: does "" (spawn_id exp4) match regular expression ".*yes.*no.*"? (No Gate, RE only) gate=yes re=no
".*password.*"? Gate "*password*"? gate=no
[email protected]'s password:
expect: does "[email protected]'s password: " (spawn_id exp4) match regular expression ".*yes.*no.*"? (No Gate, RE only) gate=yes re=no
".*password.*"? Gate "*password*"? gate=yes re=yes
expect: set expect_out(0,string) "[email protected]'s password: "
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "[email protected]'s password: "
send: sending "OMGSECRET\r" to { exp4 }
mux_client_request_session: read from master failed: Connection reset by peer
[email protected]'s password:
[email protected]'s password:

A conexão SSH está sendo estabelecida, mas ela é perdida quando tento reutilizá-la para o comando SCP. Por quê?

Possível edição final triste: Infelizmente, parece que o cygwin não suporta multiplexação .

    
por David Kennedy 01.01.2014 / 20:49

2 respostas

4

Usar um script Expect para enviar uma senha de texto sem formatação é geralmente uma idéia muito ruim. Se você precisa de conexões SSH com scripts e sem senha, é muito melhor usar a autenticação de par de chaves:

ssh-keygen # and then follow the prompts; don't set a passphrase
ssh-copy-id [email protected]

Depois disso, você pode usar ssh [email protected] sem precisar digitar sua senha.

Você ainda pode usar o muxing de conexão de controle configurado com as diretivas Control em ~/.ssh/config e fechar a conexão principal com ssh -O exit [email protected] .

Você também deve usar a utilidade ssh de simplesmente executar comandos remotamente - depois de configurar a autenticação de pares de chaves, você pode ter:

ssh [email protected] /etc/init.d/dnsmasq restart

no seu script e pronto para ir.

    
por 01.01.2014 / 20:55
0

se esta ainda é sua pergunta:

"The SSH connection is being established, but it craps out when I try to reuse it for the SCP command. Why?"

Isso acontece porque você está iniciando um shell separado com o script esperado. Sua sessão ssh está vinculada a este shell e se seu script terminar, o shell também será finalizado e sua sessão ssh será interrompida.

Desculpe, mas não tenho uma solução resumida para esse problema.

    
por 29.04.2014 / 14:55