python3 rsync cronjob

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
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo,
ich versuche vergeblich im cronjob rsync als python3 code zu erstellen, wenn ich es manuel ausführe passt alles und rsync läuft, im cronjob aber wird der befehl nicht ausgeführt, nach meiner recherche müsste ich irgendwie eine pseudo shell starten da rsync das braucht, ich weiß leider nicht wie das geht, wenn ich ssh hätte wäre das kein problem mit -t, aber leider kein ssh zu verfügung.
Hat einer schon mal das Problem gehabt? Hat einer einen Tipp wie ich das Problem lösen kann? Ich dachte shell=True reicht, leider ist dem nicht so.
Ich hoffe jemand hat eine Idee wie ich das im cronjob zu laufen bekomme.
Ich bedanke mich im Voraus.

Code: Alles auswählen

subprocess.Popen('rsync -arv --files-from=xxx.txt --exclude=*.txt,*.csv rsync://xxxx@xxx.xxx.xxx.xxx/xxxx/ /home/xxxxxx/xxxxx --password-file=/xxx/rsyncd.secrets --log-file=/home/xxxxx/logs/$(date +%Y_%m_%d_%H:%M)_mylog.log', stdin=PIPE, shell=True)
Benutzeravatar
__blackjack__
User
Beiträge: 13937
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ganja: Du verrätst ja leider nicht wie Du den cronjob definiert hast und was dann in der Logdatei steht wenn der Job versucht wird auszuführen. So kann man jetzt nur raten woran es liegen könnte.

Ich rate mal, dass das Arbeitsverzeichnis nicht das erwartete ist und deshalb die `xxx.txt` nicht gefunden wird.

Was meinst Du mit „pseudo shell“? Eine extra Shell startest Du ja. Wobei ich da zum Beispiel fragen würde ob Du die tatsächlich brauchst. So wie es aussieht nur für das ``$(date +…)``, aber *das* kann man auch in Python erledigen, da braucht man nicht extra eine Shell zwischen das eigene Programm und ``rsync`` zu setzen.

Warum biegst Du die Standardeingabe auf Dein Programm um?

Code: Alles auswählen

#!/usr/bin/env python3
import subprocess
from datetime import datetime as DateTime

...

    subprocess.run(
        "rsync",
        "-arv",
        "--files-from",
        "xxx.txt",
        "--exclude",
        "*.txt,*.csv",
        "rsync://xxxx@xxx.xxx.xxx.xxx/xxxx/",
        "/home/xxxxxx/xxxxx",
        "--password-file",
        "/xxx/rsyncd.secrets",
        "--log-file",
        f"/home/xxxxx/logs/{DateTime.now():%Y_%m_%d_%H:%M})_synclog.log",
        check=True,
    )
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo @_Blackjack_, dein bsp und mein bsp, funktionieren wenn ich es in der shell eingebe manuell, wenn ich es im cronjob habe passiert nichts, rsync braucht eine shell warum auch immer, mit subprcess.run kam am Fr Fehler Meldung < --files-from=xxx.txt > findet xxx.txt nicht, kann aber nicht sein liegt im gleichem Verzeichnis, mit subrozess.call kam keine Fehler job wurde nicht ausgeführt, ich werde mal heute Abend den bsp testen, und gebe bescheid. Im Script habe ich nach dem rsync Befehl was anderes noch da würd dann das andere gemacht, der Befehl subprocess.xxx(rsync...) würd einfach übersprungen, ich teste es mal und melde mich.
Danke für den Tipp erstmal, alles zu trennen mit "" habe ich nicht versucht.
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, rsync braucht keine shell, Du hast irgendwo anders einen Fehler. Einen Grund hatte ja __blackjack__ schon genannt: Du befindest Dich nicht in dem Verzeichnis, wo Du denkst.
Und dass Du keinen Fehler gesehen hast, liegt einfach daran, dass Du das Programm ausgeführt hast und alle Fehler ignorierst. Das kann Dir mit subprocess.run und check=True nicht passieren.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Guten morgen,
@_blackjack_, ich möchte keine Standardeingabe haben, ich möchte das script im crinjob aufrufen und es soll seine arbeit erledigen ohne interaktion mit mir ;).
Ich habe dein bsp. versucht leider geht es nicht jetzt bekomme ich folgende Fehlermeldung:

File "./scriptrsync.py", line 31, in <module>
subprocess.run(
File "/usr/lib/python3.8/subprocess.py", line 489, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.8/subprocess.py", line 753, in __init__
raise TypeError("bufsize must be an integer")
TypeError: bufsize must be an integer

line 31 subprocess.run(

--files-from=xxxx.txt habe ich geändert in
ordner=['xxxx','xxxxx','xxxxxx'] und übergebe es dann mit "ordner".
Wie gesagt mein versuch funktioniert wenn ich es manuell starte mit ./scriptrsync.py in der shell, es funktioniert ohne fehler, das möchte ich aber nicht ich möchte es im cronjob, und dann soll das script vom cronjob aufgerufen werden die ordner synchronisieren, ohne das eine interaktion notwendig ist, das will nicht.

@Sirius, das habe ich im netz gefunden gelesen, rsync-daemen würde pseudo shell brauchen, vielleicht habe ich etwas falsch verstanden. Und zu 10000% befende ich mich in dem gleichem verzeichnis
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

In __blackjack__s Beispiel fehlen einfach nur Filter eckigen Klammern.

Code: Alles auswählen

    files_from = "xxx.txt"
    source = "rsync://xxxx@xxx.xxx.xxx.xxx/xxxx/"
    target = "/home/xxxxxx/xxxxx"
    password_file = "/xxx/rsyncd.secrets"
    log_filename = f"/home/xxxxx/logs/{DateTime.now():%Y_%m_%d_%H:%M})_synclog.log"
    subprocess.run([
        "rsync",
        "-arv",
        "--files-from", files_from,
        "--exclude", "*.txt,*.csv",
        source,
        target,
        "--password-file", password_file,
        "--log-file", log_filename],
        check=True,
    )
Und was du glaubst ist unerheblich, solange eine Fehlermeldung etwas anderes sagt.
nezzcarth
User
Beiträge: 1736
Registriert: Samstag 16. April 2011, 12:47

Noch mal die Frage: Welche Fehlermeldung liefert denn Cron, wenn er versucht, das Skript auszuführen? Wie die anderen schon meinten: Skripte, die von Cron ausgeführt werden, laufen unter anderen Bedingungen als Skripte, die du aus einer interaktiven Shell heraus ausführst. Und das ist in den meisten Fällen wenn ein Skript, das eigentlich funktioniert, es per Cron nicht plötzlich nicht mehr tut, die Fehlerquelle. Prüfe, ob das Skript mit den richtigen Berechtigungen ausgeführt wird, ob absolute Pfade verwendet werden usw.

Mir ist nicht klar, warum rsyncd ein pseudo-tty brauchen sollte; hast du dazu eine Quelle?
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo @nezzcarth, ich werde dein bsp. mal testen, und gebe bescheid, Skripte werden als root ausgeführt, cron meldet nichts überspringt einfach den subpprocess.run(rsync, also mein bsp dass ich gepostet habe.
Mit eckigen [] habe ich es auch schon versucht das bsp von @_blackjack_, hat leider auch nicht funktioniert.
Danke nochmal, ich habe irgendwo die links gespeichert mit dem tty, ich werde nochmal suchen
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

"nicht funktioniert" ist eine schlechte Fehlerbeschreibung. Was meldet denn der Cronjob? Dass einfach was übersprungen wird, kann nicht sein, denn zum einen steht da check=True, das heißt, dass das Programm mit einer Fehlermeldung abbricht, wenn rsync einen Fehler meldet, zum anderen hast Du bei rsync -v angegeben, dass auch dort ausführliche Meldungen kommen.
Es sei denn, Du ignorierst irgendwo anders absichtlich alle Meldungen. Also solltest Du erst einmal alles so schreiben, dass Du die Ausgabe auch zu Gesicht bekommst.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der einzige Grund, ein Kontrollterminal zu benutzen, laege in der Eingabe des Passworts. Das sollte man aber tunlichst nicht im Klartext in eine Datei schreiben, sondern stattdessen mit SSH-Key Authentication arbeiten.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Läuft, läuft, läuft.

Danke Danke Danke Danke Danke

Danke @_blackjack_
Danke @Sirius
Danke @nezzcarth
Danke @__deets__

@__deets__ du hast recht, aber mir steht kein ssh zu verfügugung.

VIELEN DANK Jungs Danke
christheturtle
User
Beiträge: 42
Registriert: Sonntag 29. September 2019, 12:36

__deets__ hat geschrieben: Sonntag 17. Januar 2021, 12:04 Der einzige Grund, ein Kontrollterminal zu benutzen, laege in der Eingabe des Passworts. Das sollte man aber tunlichst nicht im Klartext in eine Datei schreiben, sondern stattdessen mit SSH-Key Authentication arbeiten.
kannst du das kurz erläutern / hast du eine empfehlenswerte anleitung dafür? habe jetzt schon eine ganze weile gegooglet, aber es ist wirklich schwierig, etwas verständliches zu finden, wenn man in das thema komplett neu einsteigt...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du ein Passwort im Skript angeben musst, muss das irgendwo stehen. Im Code, in der Kommandozeile, in einer Konfigurationsdatei. Alles doof, weil teilweise trivial lesbar und vor allem: wenn ich weiss, das dein Passwort geilerhengst23 ist, dann gilt das vielleicht nicht nur fuer den Server, sondern auch fuer eine Datingplattform, und ich kann damit Schaden anrichten.

Ein Key hingegen ist einmal besser geschuetzt, weil SSH selbst sich weigert den zu lesen, wenn er kein Dateirecht 0600 hat, beugt also Fehlern vor. Dann ist er ueblicherweise durch ein Passwort geschuetzt, dass du entweder beim starten des Skripts angeben musst (was aber nur fluechtig ist, und nicht im Speicher oder der Platte verbleibt, anders als die Optionen vorher!), oder das gar ueber die Keychain/Wallet deines Systems verwaltet wird. Und selbst *wenn* ich den entsperrt abgreife, ist der immer noch speziell nur auf dem System anwenbar, und nicht dein Grindr-Passwort, oder der Bank.

Details dazu musst du aber selbst erarbeiten: https://www.google.com/search?q=ssh+pub ... entication - ob und was davon gut ist, kann ich nicht beurteilen. Curse of knowledge, und so.
Antworten