Aufruf von rsync aus python Scipt macht Probleme

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
xenia
User
Beiträge: 6
Registriert: Montag 31. August 2009, 09:21

Hallo Zusammen!

Ich hab folgendes Problem mit dem ich einfach nicht weiter komme:

Ich möchte per rsync (der von pyinotify ausgelöst wird) ein Verzeichniss von einem Server über ein VPN auf einen anderen Server synchronisieren. Lokal (also ohne VPN) klappt das auch wirklich gut! Wenn ich über das VPN gehe habe ich folgende Probleme:

1. Versuch: os.system(rsync...)
läuft lokal.
Bei VPN Verbindung wird der Befehl ausgeführt, allerdings werden keine Daten übertragen. Lasse ich den String der den Befehl enthält per print direkt vor os.system am Bildschirm anzeigen, kopiere diesen und führe ihn in der shell aus, läuft er ausgezeichnet.

Also habe ich mir gedacht, daß es vielleicht daran liegt, das der Verbindungsaufbau per VPN zu lange dauert. Daher hab ich den Versuch unternommen, das Script erst dann weiter auszuführen wenn der rsync beendet ist:

2. Versuch: if pid==0: os.execl(pfad,rsync,...)
rsync wird ausgeführt und bringt eine Fehlermeldung:
rsync: change_dir "mein SRC Verzeichniss" failed: No such file or directory (2)
Ich kann auf der Konsole direkt in das in der Fehlermeldung angezeigte Verzeichniss wechseln. Ich starte das Script unter root, also sollte es doch alle Rechte haben - oder?!?

Hat vielleicht jemand von Euch ´ne Idee??? Weiß sonst nicht mehr was ich noch tun soll!

Vielen Dank im Voraus...

xenia
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo xenia, willkommen im Forum,

Hast du schon versucht das subprocess-Modul zu nutzen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
xenia
User
Beiträge: 6
Registriert: Montag 31. August 2009, 09:21

Hallo Leonidas,

danke für den Tip. Da ich mit python noch nicht so ganz auf du bin, hab ich mal nach diesem Schema abgeschrieben:

from subprocess import call
import sys
try:
retcode = call("mycmd" + " myarg", shell=True)
if retcode < 0:
print >>sys.stderr, "Child was terminated by signal", -retcode
else:
print >>sys.stderr, "Child returned", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e

Aber leider ohne Erfolg:
[Errno 2] No such file or directory

Vielleicht noch ´ne Idee?!?
xenia
User
Beiträge: 6
Registriert: Montag 31. August 2009, 09:21

So jetzt bin ich mal ´nen Schritt weiter, wenn ich:

retcode = call("rsync" + " parameter", shell=True) ausführe läuft es!!!

Das problem ist, die Parameter ändern sich, so dass ich sie aus einer Datei lese. Führe ich aber folgende Zeile aus:

retcode = call("rsync" + str(fobj.readline()),shell=True)

bekomme ich nur die rsync hilfe in der shell angezeigt. Ich vermute mein str(fobj.readline()) schreibt nicht die Parameter, und es wird nur rsync ohne alles ausgeführt. Wenn ich mir mit:

print "rsync"+str(fobj.readline())

den Befehl anzeigen lasse, sieht er ok aus?!?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du solltest besser ``subprocess.Popen`` verwenden und die Parameter als Liste übergeben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
xenia
User
Beiträge: 6
Registriert: Montag 31. August 2009, 09:21

Guten Morgen Leonidas,

hab mich die letzte Stunde mit subprocess.popen und der Liste rumgeschlagen! :wink:

Da ich rsync mit Zertifikat zwischen 2 PC´s ausführe ist die Syntax folgende:
rsync -e "ssh -i pfad zum Zertifikat" ...

Das Ergebnis mit subprocess.Popen ist folgendes:

rsync Failed to exec ssh -i ...: No such File or Directory(2)

File und Directory stimmen aber?!?

Ich krieg bald ´n Horn. Dank für Deine Geduld!

Xenia
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Code: Alles auswählen

subprocess.Popen(['rsync', '-e', '"ssh -i ..."'])
xenia
User
Beiträge: 6
Registriert: Montag 31. August 2009, 09:21

So hatte ich´s gemacht, nur das ich die Parameter vorab in eine Liste geschreiben habe!

Hab jetzt aber anscheinend ´ne Lösung gefunden:

Ich schreibe den Rsync in ein Shell Script mach es mit os.chmod ausführbar und starte es mit subprocess.call.

Ist das sauber, oder haltet Ihr das für nicht so schick?!?
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

ich kenne mich mit rsync nicht wirklich aus, aber bist du sicher, dass das so funktioniert?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

SchneiderWeisse hat geschrieben:

Code: Alles auswählen

subprocess.Popen(['rsync', '-e', '"ssh -i ..."'])
Also die inneren Quotes sind nicht nötig. Die besagen beim Shell-Aufruf ja nur "das ist jetzt ein Parameter". Das gleiche besagt ja auch schon die Liste, da musst du nicht extra noch quoten, weil sonst das Quote in den Parameter aufgenommen wird und auf dem Zielrechner ziemlich sicher kein Programm namens ``"ssh -i ..."`` vorhanden ist.

xenia: die Lösung über temporäre Dateien ist fürchterlich.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ich kenne mich mit rsync auch nicht aus, aber deine Fehlermeldung laesst vermuten, dass es nicht richtig ist "ssh -i" als einen Parameter zu uebergeben. Wenn du den Befehl aus der Bash aufrufst, schreibst du dann rsync -e ssh -i ... oder rsync -e "ssh -i"? Je nach dem koennte es vlt. so klappen:

Code: Alles auswählen

subprocess.Popen(['rsync', '-e', 'ssh', '-i'])
Die Doppelten Anfuehrungszeichen in SchneiderWeisses Version waren uebrigens ueberfluessig, du koenntest also auch nochmal das probieren:

Code: Alles auswählen

subprocess.Popen(['rsync', '-e', 'ssh -i ...'])
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

jop, das habe ich wohl zu schnell reingepastet und kopiert - die inneren Quotes sind natürlich falsch.
xenia
User
Beiträge: 6
Registriert: Montag 31. August 2009, 09:21

Dank für die rege Teilnahme:

@Leonidas -die Lösung über temporäre Dateien ist fürchterlich.:
Ich muß sowieso mit temp. Dateien arbeiten. Rsync darf nur auf einer Seite gestartet werden. So das ich, wenn sich auf der anderen Seite etwas am Dateisystem ändert eh eine Temporäre Datei per scp auf den ausführenden Server sende. Diese enthält die Änderungen damit der dort laufende rsync den sync ausführt. Der Einfachheit halber erstelle ich für beide Seiten solche temp. Dateien packe Sie in eine "Queue" die von einem python script durchsucht und abgearbeitet wird.
Das klingt vielleicht ziemlich abenteuerlich, ist aber IMHO die simpelste Lösung.

@alle: Das mit den Anführungszeichen werde ich nochmal ausprobieren.
der Befehl lautet:
rsync -e "ssh -i /pfad/zum/Zertifikat" PARAMETER SRC DST

Danke schonmal an Alle!!!
Antworten