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

schumi20091

Neuer User
Mitglied seit
19 Mai 2009
Beiträge
193
Punkte für Reaktionen
4
Punkte
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?
 
Moinsen


Reicht dafür nicht die busybox ?, bzw. : Shellscript
...und wo befindet sich der FTP-Server ?
:rolleyes: ( FREEZ!Box oder "Extern" )
 
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...
 
Zuletzt bearbeitet:
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:(
 
Zuletzt bearbeitet:
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.
 
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!
 
"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.
 
  • Like
Reaktionen: schumi20091
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?
 
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.
 
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
 
Bin leider blutiger Anfänger
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?
 
  • Like
Reaktionen: schumi20091
...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?
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
 
Zuletzt bearbeitet:
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.
 
  • Like
Reaktionen: schumi20091
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:
root@fritz:/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?
 
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
Habt Ihr eine Lösung?
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.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: schumi20091
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
 
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.
 
Dank eines anderen Forum und eines Users dort habe ich jetzt die Scripte so wie es sein soll (läuft alles über LFTP):
Script zum Ordner umbennen und erstellen:
Code:
server='ADRESSE DES SERVERS';
user='USERSAME';
pass='PASSWORT';
path='ORDNER WO DIE VIDEOS AKTUELL SIND z.B. 01_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

Und hier das Script zum Löschen der Dateien:
Code:
server='ADRESSE DES SERVERS';
user='USERSAME';
pass='PASSWORT';
path='ORDNER WO DIE VIDEOS AKTUELL SIND z.B. 01_TEST';
now=$(date +%s);
a_month_ago=$(( $now - (31 * 24 * 3600) ));

# Löschen der Videos aus dem Ordner "01_TEST"
for directory in $(lftp "$server" -u "$user","$pass" -e "cd \"$path1\" && glob -d echo *; quit")
do
    d=$(date -d "$directory" +%s 2>/dev/null) || continue
    if [ $d -lt $a_month_ago ]
    then
        lftp "$server" -u "$user","$pass" -e "cd \"$path1\" && rm -r \"$directory\"; quit"
    fi
done
#EOF

Dennoch auch Danke an die User hier im Board die geholfen haben!
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.