Esperar espera de script O comando trava

3

Eu tenho um script de espera incorporado em um script bash:

#! /bin/bash

# this function runs a command like 'ssh' and provides the password
function with_password {
expect << END
spawn $2
expect *assword:*
send -- $1
interact
wait
END
}

# run "long_running_command" on the remote server
with_password my_password "ssh my_user@some-server long_running_command"

# rsync some data to the remote server
with_password my_password "rsync /some/dir my_user@some-server:/remote/dir"

# run some other random command
with_password my_password "ssh my_user@some-server some_other_command"

O problema é que, às vezes, o script fica suspenso enquanto aguarda um comando gerado. Se eu deixe o comando wait fora do script expect, o comando continuará a ser executado no remoto servidor, mas o script bash continuará, e não tenho como saber quando termina.

Por que meu script parece estar pendurado aleatoriamente?

    
por aaron 01.09.2010 / 23:14

3 respostas

4

O comando interact no expect here-doc foi o problema. Eu precisava esperar pelo EOF:

#! /bin/bash

# this function runs a command like 'ssh' and provides the password
function with_password {
expect << END
set timeout 900
spawn $2
expect *assword:*
send -- $1
expect EOF
END
}

# run "long_running_command" on the remote server
with_password my_password "ssh my_user@some-server long_running_command"

# rsync some data to the remote server
with_password my_password "rsync /some/dir my_user@some-server:/remote/dir"

# run some other random command
with_password my_password "ssh my_user@some-server some_other_command"

O comando interact parece funcionar algumas vezes quando o comando ssh / rsync fechou a entrada na hora correta (talvez?), mas não era confiável.

    
por 02.09.2010 / 18:36
2

Que tal usar logins sem senha com chaves ssh?

Você pode criar suas chaves com ssh-keygen e depois colocar sua chave pública no final remoto: ~/.ssh/authorized_keys .

Você pode até mesmo criar chaves com passphrase (se quiser adicionar algum tipo de segurança) que você pode carregar no seu shell com ssh-agent bash insira uma vez, e ele manterá seu desbloqueado chave na memória para logins posteriores sem senha.

    
por 02.09.2010 / 01:05
1

Você está perdendo o delimitador de doc final aqui.

expect << END
spawn $2
expect *assword:*
send -- $1
interact
wait
END
    
por 02.09.2010 / 02:54