.titleBar { margin-bottom: 5px!important; }

[Frage] Unterstützte für das Script schreiben über FTP zugriff

Dieses Thema im Forum "Freetz" wurde erstellt von schumi20091, 6 Feb. 2019.

  1. schumi20091

    schumi20091 Neuer User

    Registriert seit:
    19 Mai 2009
    Beiträge:
    172
    Zustimmungen:
    4
    Punkte für Erfolge:
    18
    Hallo,
    ich möchte mir ein Script schreiben, was auch einem FTP Server Ordner erstellt, Daten verschiebt, "alte" Ordner löscht usw. Das Script soll dann mit Crontab ausgeführt werden!
    Welche Sprachen gehen da?
    Ruby (.rb)? Wenn ja reicht es das Ruby Paket beim Image Bau mit rein zu nehmen?
     
  2. koyaanisqatsi

    koyaanisqatsi IPPF-Urgestein

    Registriert seit:
    24 Jan. 2013
    Beiträge:
    10,913
    Zustimmungen:
    160
    Punkte für Erfolge:
    63
    Moinsen


    Reicht dafür nicht die busybox ?, bzw. : Shellscript
    ...und wo befindet sich der FTP-Server ?
    :rolleyes: ( FREEZ!Box oder "Extern" )
     
  3. schumi20091

    schumi20091 Neuer User

    Registriert seit:
    19 Mai 2009
    Beiträge:
    172
    Zustimmungen:
    4
    Punkte für Erfolge:
    18
    #3 schumi20091, 6 Feb. 2019
    Zuletzt bearbeitet: 6 Feb. 2019
    Als der FTP Server ist intern an einer FritzBox ohne Freetz! Ich möchte die Scripte auf einer anderen Box haben und dann von dort aus ausführen...

    Wenn ein Shell reicht, weiß du wie ich es schreiben muss?
    Intern geht aber extern weiß ich nicht wie ich es schreiben muss...
     
  4. schumi20091

    schumi20091 Neuer User

    Registriert seit:
    19 Mai 2009
    Beiträge:
    172
    Zustimmungen:
    4
    Punkte für Erfolge:
    18
    #4 schumi20091, 7 Feb. 2019
    Zuletzt bearbeitet: 7 Feb. 2019
    Ich trete leider aktuell auf der Stelle...
    Komme mit meinem Scrit überhaupt nicht weiter:
    Code:
    #!/bin/sh
    HOST='IP des Servers';
    USER='Test1';
    PASS='Test2';
    PATH='06_TEST';
    
    #Login zum FTP
    login_result= ftp_login($HOST, $USER, $PASS);
    
    #Verzeichniswechseln auf dem FTP
    ftp_chdir ($HOST, $PATH);
    #Ordner mit heutigen Datum erstellen
    ftp_mkdir ($HOST, /$(date +\%Y-\%m-\%d));
    
    
    bye
    exit 0
    END_SCRIPT
    #EOF
    Habe schonmal angefangen, aber leider funktioniert es nicht. Finde auch im Internet nichts passendes. Bin etwas Ratlos:(
     
  5. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,629
    Zustimmungen:
    633
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    Für das Automatisieren von FTP-Dialogen nimmt man besser keinen "richtigen" FTP-Client (der taugt dafür nämlich nur selten), sondern so etwas wie "lftp" oder auch "curl". Diese Programme sind deutlich besser zum Automatisieren geeignet, als ein FTP-Client, der über STDIN erst mal "interaktiv" die Kommandos erwartet - das gilt vom Prinzip her auch für das beliebte "NcFTP".

    Denn das müßte bzw. sollte man dann tatsächlich als "Dialog" implementieren (weil beim FTP durchaus zeitliche Verzögerungen auftreten können, denn Kommando-Sitzung und Datenübertragung sind getrennte Verbindungen, die nicht zwangsweise synchron laufen müssen) und das ist einigermaßen anstrengend, während ein "reiner Batch" (also alle Kommandos als "Stapel" reinschießen, so wie Du das oben versuchst) praktisch keine Chance hat, auf Fehler zu reagieren.

    "lftp" ist sogar ausdrücklich dafür geeignet, unter Angabe einer "Skript-Datei" mit den auszuführenden Kommandos gestartet zu werden.
     
  6. schumi20091

    schumi20091 Neuer User

    Registriert seit:
    19 Mai 2009
    Beiträge:
    172
    Zustimmungen:
    4
    Punkte für Erfolge:
    18
    Ich erkläre mal genau was ich vorhabe!
    1. An einer FritzBox ist eine Festplatte angeschlossen, wo der "original" FTP Server von AVM läuft. Auf diesem werden jeden Tag Dateien in dem Pfad "06_Test/Z_Heute" geschrieben.
    2. Auf der 2. FritzBox befindet sich Freetz, von hier aus soll auf dem FTP der 1. FritzBox ein Ordner mit dem jeweiligen Datum des Tages erstellt werden und dann die Dateien aus dem Ordner "Z_Heute" in den "Datumsordner" kopiert werden.

    Intern geht das schon mal:
    Code:
    #!/bin/sh
    # Ordner mit heutigem Datum erstellten
    mkdir /var/media/ftp/uStor01/06_Test/$(date +\%Y-\%m-\%d)
    # Alle Dateien aus dem Ordner "Z_Heute" in den Ordner mit dem gerade erstellten (heutigem) Datum verschieben
    mv /var/media/ftp/uStor01/06_Test/Z_Heute/* /var/media/ftp/uStor01/06_Test/$(date +\%Y-\%m-\%d)
    #EOF
    Jetzt muss ich es nur hinbekommen (mit eurer Hilfe!), das es über die andere Box geht, wie ist egal, Freetz lässt sich ja anpassen! Das Script wird ganz normal über Crontab ausgeführt...

    Hintergrund: Probleme mit dem Aktuellen Mesh System von AVM, dadurch muss ich desöftern den Support Anschreiben und wenn dort Freetz auf der Box ist, sind den meine "Probleme" ja bekanntlich egal!
     
  7. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,629
    Zustimmungen:
    633
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    "mkdir" existiert als FTP-Kommando und das "mv" heißt halt "ren(ame)" bei den meisten FTP-Clients. Ein "rename" sind immer zwei Server-Kommandos, weil zuerst mit "RNFR" die Quelle und danach mit "RNTO" das Ziel benannt wird, das "RNTO" führt das Umbenennen dann aus, was bei Linux auch über Verzeichnisgrenzen hinweg funktioniert.

    Wo ist also das Problem? Mal ganz abgesehen davon, daß die oben gezeigte Reihenfolge (ohne nähere Infos jedenfalls) ja schon einigermaßen blödsinnig ist (nicht falsch verstehen, ist rein eine Beschreibung der Intention, nicht der Person, die diese Idee hatte und in meiner Welt auch keinesfalls "ehrenrührig"), denn hier wäre es ja viel einfacher, den Ordner "Z_Heute" passend umzubenennen (das macht das FTP-"rename" beim AVM-Server auch problemlos) und danach einen neuen "Z_Heute"-Ordner anzulegen.

    Das hat auch noch den Vorteil (in den meisten Situationen jedenfalls und für die gegenteilige Annahme fehlen die erwähnten Infos), daß noch geöffnete Dateien einfach mit "verschoben" werden, weil sich die Inodes im Filesystem gar nicht ändern.
     
    schumi20091 gefällt das.
  8. schumi20091

    schumi20091 Neuer User

    Registriert seit:
    19 Mai 2009
    Beiträge:
    172
    Zustimmungen:
    4
    Punkte für Erfolge:
    18
    Ganz ehrlich mit dem Umbennen bin ich garnicht draufgekommen!
    In dem Ordner "Z_Heute" werden Videos von Überwachungskameras abgelegt. Damit man Übersicht hat soll, wenn der Tag (23:59:59) vorbei ist, sollen alle Videos in dem Tages "Datumsordner sein"! Aber mit dem Umbennen wurde ja ohne Probleme gehen...ist ja nur ein Bruchteil einer Sekunde!

    Wären den die Schritte mit dem Login zum FTP soweit richtig?
     
  9. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,629
    Zustimmungen:
    633
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    Solange die Videodateien nur beim Erkennen einer Bewegung aufgezeichnet werden und ansonsten die Files geschlossen sind, sollte das auch klappen mit dem Umbenennen des Verzeichnisses. Wenn die Dateien aber permanent offen sind (dann klappt aber auch der andere Weg nicht), ist das ein Problem.

    Beim "Skript" in #4 blicke ich (nach der Änderung, die ja nur sehr kurz nach meinem Beitrag #5 erfolgte) nun gar nicht mehr durch.

    Es gibt (in meinen "eva_tools" für Linux) ein Beispiel, wie man als Shell-Benutzer FTP-Kommandos "zu Fuß" absetzen kann über entsprechende FIFOs und mit den "normalen" Shell-Mitteln (allerdings braucht es dafür auch ein "netcat" auf der Box).

    Einen FTP-Client, der auf den Namen "ftp" hört (wie es im Skript anfangs stand), kenne ich auf der FRITZ!Box gar nicht - auch nicht in "Freetz". Gibt es das Kommando denn tatsächlich? Wenn ja, aus welchem Paket wäre das dann?

    Es gibt aber tatsächlich ein "lftp" als Paket in Freetz - nur paßt aus Deinem "snippet" in #4 ja eigentlich auch gar nichts zu diesem Programm. Daher kann man auch schlecht einschätzen, was Du da eigentlich machst.

    Vielleicht wirfst Du (wenn Du Dich mit Shell-Code auskennst) ja tatsächlich mal einen Blick in eines der Skripte aus "eva_tools" (sowohl "eva_to_memory" als auch "eva_store_tffs" enthalten ein FTP-Login als Beispiel, wenn auch mit festen Credentials für den Bootloader der FRITZ!Box) - obwohl "lftp" weiterhin die einfachere Variante wäre (die hier sogar ich wählen würde anstelle meiner Shell-Versionen, weil es egal ist, ob man ein "netcat" oder ein "lftp" dazupacken muß auf der Box) und dafür findest Du im Internet genug Beispiele.
     
  10. schumi20091

    schumi20091 Neuer User

    Registriert seit:
    19 Mai 2009
    Beiträge:
    172
    Zustimmungen:
    4
    Punkte für Erfolge:
    18
    Bin leider blutiger Anfänger :rolleyes:

    Hab das Script mal etwas geändert, was sollte ich da noch Ändern?
    Code:
    #!/bin/sh
    HOST='IP DES FTP'
    USER='USER'
    PASS='PASS'
    PATH='06_Test'
    
    #Login zum FTP
    ftp -n $HOST <<END_SCRITP
    quote USER $USER
    quote PASS $PASS
    
    # Ordner "Z_Heute" umbennen in das heutige Datum
    RNFR $PATH/Z_Heute
    RNTO $ (date +\%Y-\%m-\%d)
    
    # Ordner "Z_heute" erstellen
    mkdir $PATH/Z_Heute
    
    quit
    exit 0
    END_SCRIPT
    #EOF
     
  11. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,629
    Zustimmungen:
    633
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    Aber Du hast schon Internet, oder? Von einer größeren Downtime bei den Suchmaschinen habe ich auch nichts gelesen ... wie wäre es denn mal mit dieser Suche?

    https://www.google.com/search?q=lftp+script

    Daß Du 1x "rename" und 1x "mkdir" brauchst, weißt Du bereits ... vielleicht solltest Du einfach mal damit (und vor allem mit "lftp", denn ich habe immer noch keine Idee (und keine Antwort von Dir in dieser Richtung), wo Du auf der FRITZ!Box ein Programm namens "ftp" her haben könntest) probieren?
     
    schumi20091 gefällt das.
  12. schumi20091

    schumi20091 Neuer User

    Registriert seit:
    19 Mai 2009
    Beiträge:
    172
    Zustimmungen:
    4
    Punkte für Erfolge:
    18
    #12 schumi20091, 10 Feb. 2019
    Zuletzt bearbeitet: 10 Feb. 2019
    Moin,
    jetzt habe ich dich richtig verstanden. Auf der Freetz Box kommt jetzt "lftp" als Client zum Ausführen des Script drauf!

    Dann müsste es ja so etwa aussehen:
    Code:
    #!/bin/sh
    PROTOCOL='ftp'
    URL='IP DES FTP'
    USER='USER'
    PASS='PASS'
    PATH='06_Test'
    
    #Login zum FTP
    lftp $PROTOCOL://$URL
     USER $USER "$PASS"
    
    # Ordner "Z_Heute" umbennen in das heutige Datum
    RNFR $PATH/Z_Heute
    RNTO $ (date +\%Y-\%m-\%d)
    
    # Ordner "Z_heute" erstellen
    mkdir $PATH/Z_Heute
    
    quit
    exit 0
    #EOF
     
  13. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,629
    Zustimmungen:
    633
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    Ich sage mal, das funktioniert so immer noch nicht ... aber eine Internet-Suche nach "lftp" und "scripting" sollte genug Beispiele zutage fördern (auch mit "inline files" oder "here documents", wie die im "Shell-Jargon" auch schon mal genannt werden), wie man das mit "lftp" richtig macht.
     
    schumi20091 gefällt das.
  14. schumi20091

    schumi20091 Neuer User

    Registriert seit:
    19 Mai 2009
    Beiträge:
    172
    Zustimmungen:
    4
    Punkte für Erfolge:
    18
    Hallo,
    jetzt habe ich schonmal ein Teil der Funktioniert, das Umbennen und Neu Erstellen von dem Ordner:
    Code:
    #!/bin/sh
    server='IP des FTP';
    user='User';
    pass='Pass';
    path='06_Test';
    
    #Warte Zeit, damit die Uhrzeit 23:59:58Uhr ist
    sleep 58
    
    #FTP Login, Ordner "Z_Heute" mit dem heutigen Datum umbennen und Ordner "Z_Heute" erstellen
    lftp "$server" -u "$user","$pass" -e "cd \"$path\" && mv \"Z_Heute\" \"$(date +%Y-%m-%d)\" && mkdir \"Z_Heute\" && exit"
    
    #EOF
    Jetzt Fehlt nur noch das Automatische löschen von Ordnern die Älter als 30 Tage sind. Ich habe schonmal etwas erstellt, bekomme aber leider eine Fehlermeldung:
    Code:
    #!/bin/sh
    server='IP des Server';
    user='User';
    pass='Pass';
    path1='06_Test';
    
    # Ordner löschen aus dem Ordner "06_Test" die Älter als 30 Tage sind
    lftp "$server" -u "$user","$pass" -e "cd \"$path1\" && rm -r $(date -d "now -31 days" +%Y-%m-%d); exit
    
    #EOF
    Bekomme aber leider diese Fehlermeldung:
    Code:
    [email protected]:/var/mod/root# /var/media/ftp/Scripte/06_Videos_loeschen.sh
    date: invalid date 'now -31 days'
    cd ok, cwd=/06_Test
    Usage: rm [-r] [-f] files...
    Habt Ihr eine Lösung?
     
  15. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,629
    Zustimmungen:
    633
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    #15 PeterPawn, 17 Feb. 2019 um 13:03 Uhr
    Zuletzt bearbeitet: 17 Feb. 2019 um 13:30 Uhr
    Was denkst Du denn selbst, was da der Fehler sein könnte?

    Wenn man Dir jetzt einen Tipp geben würde, wie man das alternativ berechnen kann, wäre das allerdings deutlich mehr als ein Hinweis auf die Ursache des Problems - aber eigentlich sollte Dir ja schon ein simpler Aufruf von "date" (mit den entsprechenden Optionen) auf der FRITZ!Box mehr als nur einen zarten Hinweis darauf liefern, wo hier das Problem liegt. Insofern kann man
    auch schon mal falsch verstehen - nämlich als Aufforderung, das an Deiner Stelle zu lösen.

    Daher mal die "Grundlagen": Linux-Systeme (und andere Unix-artige) benutzen zur Darstellung der Uhrzeit gerne einen Zähler, der die Anzahl der Sekunden seit dem 01.01.1970 01:00 Uhr (für MEZ, ansonsten 0:00 Uhr) enthält - dieser Startwert (genannt "The Epoch") gibt häufig auch dem Wert den Namen ("epoch", aber auch "unixtime" oder ähnliches). Der Vorteil zweier Datumswerte in dieser Darstellung ist es, daß man ganz einfach die Differenz zweier Werte bilden kann oder auch problemlos eine bekannte Zeitspanne zu einem anderen Wert addieren kann für künftige "Termine" als auch zur Berechnung zurückliegender Daten subtrahieren.

    So kann man auch leicht ermitteln, um wieviele Sekunden sich das Datum vor 31 Tagen vom heutigen unterscheidet, nämlich: 31 * 24 * 60 * 60 = 31 * 86.400 (ein Wert, der sich jedem, der mit Linux-Zeiten rechnen muß, quasi "eingebrannt" hat als Anzahl der Sekunden eines Tages) = 2.678.400 Sekunden. Den Wert muß man nun nur vom aktuellen abziehen (die Funktionen für den Umgang mit "epoch values" bietet praktisch jedes "date"-Kommando, auch das der BusyBox, was die "Kunststückchen" des GNU-Programms (m.E. ohnehin eher brotlose Kunst und mehr "Liebhaberei" des Autoren) nicht mitmacht - die auch dort nur in der "info"-Datei ausführlich beschrieben sind und nicht in dessen Man-Page) und schon hat man einen Wert, den man sich wieder in ein Datum umwandeln lassen kann.

    Wobei es hier (auch weil "Schaltsekunden" und deren Einbeziehung nicht klar geregelt sind, zumindest soweit ich weiß) ohnehin wieder schlauer wäre, das "maximale Alter" so eines Ordners festzulegen und dann alles zu löschen, was älter ist ... ansonsten bleibt auch schon mal ein Ordner stehen, weil die Berechnung nicht exakt den Zeitpunkt ergibt, der im Namen enthalten ist. Vielleicht ist es ja auch eine Überlegung wert (kommt halt auf die "Auswertesoftware" an und sogar noch darauf, wie oft man die benutzen muß), das Datum gleich als "epoch" im Dateinamen abzulegen ... das macht dann Vergleiche, ob die Datei vor oder nach einem Datum liegt (u.a. auch solche wie "gib mir alle Dateien der letzten 7 Tage") wieder leichter und solange man die Umrechnung nicht von Hand machen muß, spielt ein "lesbarer" Name auch nicht unbedingt eine Rolle. Zumal man in Verzeichnislisten ja auch oft genug noch das Datum der Erstellung eines Verzeichnisses anzeigen lassen kann neben dem Namen (nicht zu verwechseln mit der "access time") und das wäre dann ja wieder (wenn ich die Idee richtig verstehe anhand der gezeigten "Schnipsel") das aktuelle Datum, wenn man das wirklich "von Hand" durchsehen muß.

    Klartext: Ich würde hier eher alle Verzeichnisnamen "einlesen" in das Skript und dann die Auswertung über die Verzeichnisnamen laufen lassen, welche nun Kunst sind und welche weg können ... das dann wieder mit einem gezielten FTP-Aufruf. Im Idealfall (wenn das Skript tatsächlich jeden Tag läuft ... und auch noch jeden Tag erfolgreich läuft) ist das dann auch wieder nur ein einzelner Aufruf zum Löschen eines Verzeichnisses ... aber wenn es mal schiefgegangen ist und 3 Wochen nichts gelöscht wurde, dann löscht (sofern man meinen "Vorschlag" für die Logik implementiert) auch ein einzelner Aufruf wieder alle betroffenen Verzeichnisse, ohne daß man dafür "Hand anlegen" müßte - was bei einer Logik "Lösche den Ordner, dessen Name das Datum von 'heute vor 31 Tagen' enthält." schon mal nicht möglich wäre.

    Aber die möglichen Fehler und ihre Wahrscheinlichkeiten muß ebenso jeder selbst bewerten, wie er sich einen Plan zurechtlegen muß, wie er damit umgehen will und was es ihm an Aufwand wert ist, einen reibungslosen (und unbeaufsichtigten) Betrieb von Beginn an zu planen. Manchmal ist auch das "manuelle Nacharbeiten" eine denkbare Alternative, wenn die Wahrscheinlichkeit von Problemen ohnehin gegen Null geht. In einem Einsatz zweier FRITZ!Boxen würde ich (persönlich) aber noch kein "Hochverfügbarkeitssystem" sehen ... da bleibt schon mal die eine oder andere hängen oder startet zur Unzeit neu.
     
    schumi20091 gefällt das.
  16. schumi20091

    schumi20091 Neuer User

    Registriert seit:
    19 Mai 2009
    Beiträge:
    172
    Zustimmungen:
    4
    Punkte für Erfolge:
    18
    Hallo,
    also wäre der Ansatz so:
    Code:
    #!/bin/bash
    server='IP DES SERVER'
    user='USERNAME'
    pass='PASSWORD'
    path='06_Test'
    
    now=$(date +%s)
    a_month_ago=$(( $now - (30 * 24 * 3600) ))
    for directory in $(lftp "$server" -u "$user","$pass" -e "cd \"$path\" && glob -d echo *; quit")
    do
        d=$(date -d $directory +%s) || continue
        if [ $d -lt $a_month_ago ]
        then
            lftp "$server" -u "$user","$pass" -e "cd \"$path\" && rm -r \"$directory\"; quit"
        fi
    done
     
  17. PeterPawn

    PeterPawn IPPF-Urgestein

    Registriert seit:
    10 Mai 2006
    Beiträge:
    11,629
    Zustimmungen:
    633
    Punkte für Erfolge:
    113
    Beruf:
    IT-Freelancer
    Ort:
    Berlin
    In etwa ... das größte Problem dürfte es hier sein, daß man dem "date"-Kommando nicht einfach ein FTP-Verzeichnis "hinwerfen" kann, auch wenn das Kommando einen "reference"-Parameter kennt. Der liefert trotzdem nur das Datum der letzten Änderung - wenn man die Angabe, wann eine Datei oder ein Verzeichnis erstellt wurde, sucht, dann benutzt man i.d.R. eher das "stat"-Kommando mit %W als Ausgabeformat.

    Aber auch das wird über eine FTP-Verbindung nicht ohne weiteres funktionieren - daher ja die Empfehlung, die Dateinamen entsprechend zu gestalten, dann kann man diese entweder direkt verwenden (wenn es wirklich nur die Zahl ist) oder sich zumindest den numerischen Teil von einem Namen für einen solchen Vergleich abtrennen.