Estou tentando automatizar a implantação de alguns pacotes .deb com um script. Quero executar sudo dpkg -i $myDeb.deb
em uma lista de máquinas remotas que posso acessar com ssh.
Tentei automatizar o comando com 'expect' dentro de um script bash, mas obviamente estou fazendo algo errado porque recebo vários erros diferentes (dependendo de onde 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 assim, recebo
expect: invalid option -- 't'
Se eu mudar para:
spawn /usr/bin/ssh -t borrajax@$remoteMachine '/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall'
Parece que você está tentando executar o comando sudo dpkg localmente (primeiro ssh(s) para '$remoteMachine' e depois executa 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 entendo isso couldn't execute "'/usr/bin/ssh": no such file or directory
(o que não é verdade)
... e neste ponto, fiquei sem ideias...:-)
Qualquer dica será apreciada. Obrigado.
Responder1
Acho que você perdeu um nível de escape de aspas. Nesse alto nível de escape, é melhor simplesmente criar um pequeno script para cada estágio onde, de outra forma, seriam necessárias cotações.
Caso contrário, você pode tentar esta versão modificada (mas lembre-se, eu não incentivo 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
}
Responder2
Por que as pessoas sempre usam essas expect
coisas feias com ssh
? Use chaves ssh e pronto (leia sobre criptografia de chave pública para teoria, basta usar 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 precisar fazer malabarismos entre três níveis de cotação, você escreverá naturalmente os comandos corretos.