
Estoy intentando automatizar la implementación de algunos paquetes .deb con un script. Quiero ejecutar sudo dpkg -i $myDeb.deb
en una lista de máquinas remotas a las que puedo acceder con ssh.
Intenté automatizar el comando con 'esperar' dentro de un script bash, pero obviamente estoy haciendo algo mal porque recibo varios errores diferentes (dependiendo de dónde pongo las comillas, básicamente)
Esta es la función que tengo (se llamará con algo como: _remoteInstallation "myPackage115.deb" "192.168.1.55"
. Sé que en la máquina remota, el .deb estará ubicado en $HOME/Documentos/:
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
}
Con las comillas en el área generada de esa manera, obtengo
expect: invalid option -- 't'
Si lo cambio a:
spawn /usr/bin/ssh -t borrajax@$remoteMachine '/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall'
Parece que está intentando ejecutar el comando sudo dpkg localmente (primero ssh(s) a '$remoteMachine' y luego ejecuta sudo dpkg localmente, como dos comandos separados)
Con este:
spawn '/usr/bin/ssh -t borrajax@$remoteMachine \'/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall\''
Entiendo eso couldn't execute "'/usr/bin/ssh": no such file or directory
(lo cual no es cierto)
... y en este punto, me quedé sin ideas...:-)
Cualquier pista será apreciada. Gracias.
Respuesta1
Lo que uso para un problema similar es poner todos los scripts remotos en un archivo, digamos /usr/local/bin/debinstall.sh
. Mi sugerencia para eso en su caso sería: tener un directorio especial donde colocar los paquetes; llamémoslo /tmp/remoteinstall
para tener un ejemplo. Además, coloque el usuario con el que se conecta en el /etc/suduers
archivo y permita que se ejecute sudo dpkg -i *
sin que se le solicite una contraseña. debinstall.sh
entonces se vería así:
#!/bin/bash
cd /tmp/remoteinstall
sudo dpkg -i *.deb && rm -f *
Haga que este script sea propiedad de y chmod 744 /usr/local/bin/debinstall.sh
.
Localmente, su trabajo sería simplemente cargar sus archivos .deb y llamar al script:
cd /path/to/files
scp * user@remotemachine:/tmp/remoteinstall
ssh user@remotemachine /usr/local/bin/debinstall.sh
debinstall.sh
Luego instalaría sus paquetes y luego vaciaría el directorio.sólo cuando la instalación finalizó exitosamente.
En caso de que falte algo en el archivo $PATH
, recuerde que ni .bashrc
ni .profile
se ejecutan de esta manera, por lo que es posible que desee obtenerlos al comienzo del script remoto o definir la RUTA apropiada allí.