SSH + Sudo + Esperar no script Bash: Executar comando com sudo na máquina remota

3

Estou tentando automatizar a implantação de alguns pacotes .deb com um script. Eu quero executar sudo dpkg -i $myDeb.deb em uma lista de máquinas remotas que eu posso acessar com ssh.

Eu tentei automatizar o comando com 'esperar' dentro de um script bash, mas obviamente estou fazendo algo errado porque recebo vários erros diferentes (dependendo de onde eu coloquei as aspas, basicamente)

Esta é a função que tenho (será chamada com algo como: _remoteInstallation "myPackage115.deb" "192.168.1.55" . Eu sei que na máquina remota, o .deb estará localizado em $ HOME / Documents /:

function _remoteInstallation(){
    local retval=1
    local debToInstall=$(basename "$1")
    local remoteMachine="$2"
    spawned=$(expect -d -c "
          set timeout 1800
          spawn "/usr/bin/ssh -t borrajax@$remoteMachine /usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall"'
          expect {
                \"Are you sure you want to continue connecting\" { send \"yes\r\"; exp_continue }
                \"password\" { send \"myPassword\r\";  exp_continue }
                \"[sudo] password\" { send \"myPassword\r\";  exp_continue }
                default { exit 1 }
          }
    " )
    retval=$?
    return $retval
}

Com as aspas na área gerada desse jeito, recebo

expect: invalid option -- 't'

Se eu alterá-lo para:

 spawn /usr/bin/ssh -t borrajax@$remoteMachine '/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall'

Parece que está tentando executar o comando sudo dpkg localmente (primeiro ssh (s) para '$ remoteMachine' e, em seguida, executa o sudo dpkg localmente, como dois comandos separados)

Com isso:

spawn '/usr/bin/ssh -t borrajax@$remoteMachine \'/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall\''

Eu recebo esse couldn't execute "'/usr/bin/ssh": no such file or directory (o que não é verdade)

... e neste momento, fiquei sem ideias ... : -)

Qualquer sugestão será apreciada. Obrigado.

    
por BorrajaX 03.07.2012 / 18:43

2 respostas

3

Acho que você perdeu um nível de citações que escapou. Nesse alto nível de escape, é melhor simplesmente fazer um pequeno script para cada estágio onde aspas seriam necessárias.

Caso contrário, você poderia tentar esta versão modificada (mas lembre-se, eu não encorajo esse estilo de codificação!)

function _remoteInstallation(){
    local retval=1
    local debToInstall=$(basename "$1")
    local remoteMachine="$2"
    spawned=$(expect -d -c "
          set timeout 1800
          spawn \"/usr/bin/ssh -t borrajax@$remoteMachine /usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall\"
          expect {
                \"Are you sure you want to continue connecting\" { send \"yes\r\"; exp_continue }
                \"password\" { send \"myPassword\r\";  exp_continue }
                \"[sudo] password\" { send \"myPassword\r\";  exp_continue }
                default { exit 1 }
          }
    " )
    retval=$?
    return $retval
}
    
por 03.07.2012 / 19:02
3

Por que as pessoas sempre usam esse material expect feio com ssh ? Use as chaves ssh e você está pronto (leia a criptografia de chave pública para teoria, use ssh-copy-id remotemachine de uma vez por todas para praticar). Então o uso é tão simples quanto

ssh remote-machine "remote-shell-command" > local-redirection-of-command-output

Assim que você não tiver que fazer malabarismos entre os 3 níveis de cotação, você naturalmente escreverá os comandos corretos.

    
por 03.07.2012 / 18:50