SSH + Sudo + Erwarten Sie im Bash-Skript: Führen Sie den Befehl mit Sudo in der Remote-Maschine aus

2705
BorrajaX

Ich versuche, die Bereitstellung einiger .deb-Pakete mit einem Skript zu automatisieren. Ich möchte sudo dpkg -i $myDeb.debin einer Liste von entfernten Maschinen ausführen, auf die ich mit ssh zugreifen kann.

Ich habe versucht, den Befehl mit "Expect" in einem Bash-Skript zu automatisieren, aber ich mache offensichtlich etwas falsch, weil ich eine Reihe verschiedener Fehler bekomme (abhängig davon, wo ich die Anführungszeichen einsetze).

Dies ist die Funktion, die ich habe (wird mit etwa wie folgt aufgerufen:.) _remoteInstallation "myPackage115.deb" "192.168.1.55"Ich weiß, dass in der Remote-Maschine das .deb in $ HOME / Documents / liegt.

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 Zitaten in der Spawn-Zone bekomme ich

expect: invalid option -- 't' 

Wenn ich es ändere:

 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 man versuchen, den sudo dpkg-Befehl lokal auszuführen (zuerst ssh (s) an '$ remoteMachine') und dann sudo dpkg lokal ausführen, 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 bekomme das couldn't execute "'/usr/bin/ssh": no such file or directory(was nicht stimmt)

... und zu diesem Zeitpunkt sind mir die Ideen ausgehen ... :-)

Jeder Hinweis wird geschätzt. Vielen Dank.

0
Auch auf Unix & Linux http://unix.stackexchange.com/q/42252/4667 veröffentlicht glenn jackman vor 12 Jahren 1

1 Antwort auf die Frage

1
Izzy

Was ich für ein ähnliches Problem benutze, ist das gesamte Remote-Skript in eine Datei zu schreiben /usr/local/bin/debinstall.sh. Mein Vorschlag dazu wäre in Ihrem Fall: Haben Sie ein spezielles Verzeichnis, in dem Sie die Pakete ablegen - lassen Sie uns es nennen /tmp/remoteinstall, um ein Beispiel zu haben. Fügen Sie den Benutzer, mit dem Sie sich verbinden, in die /etc/suduersDatei ein und lassen Sie ihn ausführen, sudo dpkg -i *ohne dass Sie zur Eingabe eines Kennworts aufgefordert werden. debinstall.shwürde dann so aussehen:

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

Machen Sie dieses Skript im Besitz von und chmod 744 /usr/local/bin/debinstall.sh.

Lokal wäre es Ihre Aufgabe, 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.shDann installieren Sie Ihre Pakete und leeren das Verzeichnis erst dann, wenn die Installation erfolgreich abgeschlossen wurde .

Falls etwas im fehlt $PATH, denken Sie daran, dass weder so .bashrcnoch .profileausgeführt wird - Sie möchten sie entweder am Anfang des Remote-Skripts als Quelle verwenden oder dort den entsprechenden PFAD definieren.

Es stellt sich heraus, dass die Klammern in der \ "[sudo] \" -Option alles durcheinander gebracht haben. Ich bekam es endlich mit dem Spawn-Bereich zu arbeiten, der so aussah: \ "und Klammern in Sudo (\" \\ [Sudo \\] \ ") BorrajaX vor 12 Jahren 0
Ich freue mich zu lesen, dass Sie es gelöst haben! In diesem Fall hat Ihre Variante den Vorteil, dass nur eine Maschine gewartet werden muss;) Izzy vor 12 Jahren 0