
Ich versuche, die Bereitstellung einiger .deb-Pakete mit einem Skript zu automatisieren. Ich möchte es sudo dpkg -i $myDeb.deb
in einer Liste von Remote-Rechnern ausführen, auf die ich per SSH zugreifen kann.
Ich habe versucht, den Befehl mit „expect“ in einem Bash-Skript zu automatisieren, aber ich mache offensichtlich etwas falsch, da ich eine Reihe unterschiedlicher Fehler erhalte (im Wesentlichen abhängig davon, wo ich die Anführungszeichen setze).
Dies ist die Funktion, die ich habe (wird mit etwas wie diesem aufgerufen: _remoteInstallation "myPackage115.deb" "192.168.1.55"
. Ich weiß, dass sich die .deb-Datei auf dem Remotecomputer in $HOME/Documents/ befindet:
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
}
Mit den Anführungszeichen im erzeugten Bereich wie diesen bekomme ich
expect: invalid option -- 't'
Wenn ich es ändere in:
spawn /usr/bin/ssh -t borrajax@$remoteMachine '/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall'
Es sieht so aus, als würde versucht, den Befehl „sudo dpkg“ lokal auszuführen (zuerst per SSH zu „$remoteMachine“ und dann lokal „sudo dpkg“ ausführen, also wie zwei separate Befehle).
Mit diesem:
spawn '/usr/bin/ssh -t borrajax@$remoteMachine \'/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall\''
Ich verstehe das couldn't execute "'/usr/bin/ssh": no such file or directory
(was nicht stimmt)
... und an diesem Punkt gingen mir die Ideen aus ...:-)
Jeder Hinweis ist willkommen. Vielen Dank.
Antwort1
Was ich für ein ähnliches Problem verwende, ist, alle Remote-Skripte in eine Datei zu packen, sagen wir /usr/local/bin/debinstall.sh
. Mein Vorschlag dafür in Ihrem Fall wäre: Legen Sie ein spezielles Verzeichnis an, in das Sie die Pakete ablegen – nennen wir es /tmp/remoteinstall
der Einfachheit halber. Tragen Sie außerdem den Benutzer, mit dem Sie sich verbinden, in die /etc/suduers
Datei ein und lassen Sie die Ausführung zu sudo dpkg -i *
, ohne dass Sie nach einem Passwort gefragt werden. debinstall.sh
Das würde dann so aussehen:
#!/bin/bash
cd /tmp/remoteinstall
sudo dpkg -i *.deb && rm -f *
Machen Sie dieses Skript zu und zum Eigentum von chmod 744 /usr/local/bin/debinstall.sh
.
Ihre Aufgabe vor Ort besteht lediglich darin, Ihre .deb-Dateien hochzuladen und das Skript aufzurufen:
cd /path/to/files
scp * user@remotemachine:/tmp/remoteinstall
ssh user@remotemachine /usr/local/bin/debinstall.sh
debinstall.sh
würde dann Ihre Pakete installieren und anschließend das Verzeichnis leerennur wenn die Installation erfolgreich abgeschlossen wurde.
Falls etwas in fehlt $PATH
, denken Sie daran, dass weder .bashrc
noch .profile
auf diese Weise ausgeführt werden. Sie sollten sie daher entweder am Anfang des Remote-Skripts als Quelle angeben oder dort den entsprechenden PFAD definieren.