SSH + Sudo + Expect no script Bash: execute o comando com sudo na máquina remota

SSH + Sudo + Expect no script Bash: execute o comando com sudo na máquina remota

Estou tentando automatizar a implantação de alguns pacotes .deb com um script. Quero executar sudo dpkg -i $myDeb.debem 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

O que eu uso para um problema semelhante é colocar todo o script remoto em um arquivo, digamos /usr/local/bin/debinstall.sh. Minha sugestão para isso no seu caso seria: Tenha um diretório especial onde você coloca os pacotes - vamos chamá-lo /tmp/remoteinstallpara ter um exemplo. Além disso, coloque o usuário ao qual você se conectou no /etc/suduersarquivo e permita que ele seja executado sudo dpkg -i *sem que seja solicitada uma senha. debinstall.shentão ficaria assim:

#!/bin/bash
cd /tmp/remoteinstall
sudo dpkg -i *.deb && rm -f *

Torne este script de propriedade de e chmod 744 /usr/local/bin/debinstall.sh.

Localmente, seu trabalho seria simplesmente fazer upload de seus arquivos .deb e chamar o script:

cd /path/to/files
scp * user@remotemachine:/tmp/remoteinstall
ssh user@remotemachine /usr/local/bin/debinstall.sh

debinstall.shinstalaria então seus pacotes e depois esvaziaria o diretóriosomente quando a instalação for concluída com sucesso.

Caso algo esteja faltando no $PATH, lembre-se de que nenhum .bashrcdeles .profileé executado dessa maneira - então você pode querer obtê-los no início do script remoto ou definir o PATH apropriado lá.

informação relacionada