FTP Daten automatisch downloaden

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

FTP Daten automatisch downloaden

Beitrag von bRun0 » 10.10.2007 20:50:29

heyho,

ich suche derzeit nach einer möglich wie ich ein paar ftp daten automatsich downloaden kann;

ich hab derzeit schon eine für mich bis dato brauchbare möglichkeit gefunden, allerdings benötige ich nun mehr funktionen an welchen ich nun scheitere.

folgendes; ich hab lasse auf einem vserver alle 12std einen mysql DB backzp via mysqldumper erstellen, die daten werden dann in einem ordner abgelegt und es werden immer die letzten 5backup beibehalten.

die struktur sieht dann in etwa so aus
usr_web2_1_2007_10_08_11_59.sql.gz
usr_web2_1_2007_10_08_23_59.sql.gz
usr_web2_1_2007_10_09_11_59.sql.gz
usr_web2_1_2007_10_09_23_59.sql.gz
usr_web2_1_2007_10_10_11_59.sql.gz
momentan lasse ich das ganze eher unsauber runterladen

Code: Alles auswählen

cd /var/www/mysqldumper/work/backup

screen -A -m -d -S FTPSYNC ncftpget -u USER -p PASS ftp://meinedomain.de/html/msd1.23/work/backup/*.gz
exit
so werden jetzt alle files runtergeladen welche sich in dem ordner befinden, files die bereits existieren bleiben unangetastet, allerdings sammel sich so bei mir local auf die dauer ne menge files da ja ältere files nicht gelöscht werden.

ich möchte jetzt aber das am allerbesten immer nur die neueste datei und keine mehr geladen wird und diese dann direkt danach auch local in in die mysql datenbank eingespielt wird.

hintergrund ist der das ich local an der seite (community) viel programmier und dort zu testzwecken immer eine aktuelle version benötige.
täglich manuel ein backup einzuspielen dauert allerdings zu lange da die datenbank im gz format ca 30MB groß ist und ich das einspielen 10-15min dauern kann. (jeh nach derzeitiger belastung meiner debian kiste)

wie ein mysql befehl zum einspielen einer sql bzw gz datei aussieht weis ich, ich komm nur nich damit klar wie ich aufm ftp auslese was die neueste datei ist, diese zu downloaden und dann noch genau diese eine datei (dessen dateiname ja variiert) via script einzuspielen

jemand ne idee, lösung, möglichkeit, tip? irgendwas?

wäre super =)

Benutzeravatar
Profbunny
Beiträge: 595
Registriert: 04.04.2004 11:12:29
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Bautzen

Beitrag von Profbunny » 10.10.2007 22:26:26

ich mach das bei meiner website ähnlich, aber mit wget, diese tool kann viel mehr als nur daten runterladen.

http://www.tijink.de/blog/2007/03/17/ba ... ess-blogs/

und ein wenig mit den optionen spielen, den rest macht bei mir cron.

hth
Rechner / Server Debian sid

FitzeFatze
Beiträge: 834
Registriert: 06.07.2004 10:08:21

Beitrag von FitzeFatze » 10.10.2007 22:44:56

hey,

kenn mich mit shellscripts nicht wirklich aus, aber du koenntest es doch die heruntergeladene datei schon automatisch umbenannen lassen?!

ciao

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 11.10.2007 09:21:22

Die Lösung mittels wget, wie sie Profbunny aufgeführt hat, finde ich gut.

Nicht zu kompliziert und einfach zu hand haben.
Werde das auch mal ausprobieren.
Oh, yeah!

bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bRun0 » 11.10.2007 11:57:14

das was wget hier in dem beispiel macht, macht mein script genauso ^^

es lädt alle files aus einem ordner runter, nicht nur eins. und das ist mein problem

ich möchte das komplett automatisiert haben so das immer nur das neueste file runtergeladen wird, der datei name ggf umbenannt so das ich dieses file direkt danach entpachen und in die datenbank einspielen kann..

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 11.10.2007 14:02:33

hi,

wenn du gleich nach dem Erstellen einer neuen "usr_web2_xxx.sql.gz"
einen Link darauf setzen könntest, könnten alle anderen Scripte mit
einem festen Dateinamen arbeiten.
Beware of programmers who carry screwdrivers.

bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bRun0 » 11.10.2007 15:57:27

genau das geht leider nicht.


gibts den keinen befehl oder keine möglichkeit bei einem ftp connect zu sagen lade bitte nur eine und zwar die neueste datei runter?!

nil
Beiträge: 989
Registriert: 08.06.2005 13:28:36

Beitrag von nil » 11.10.2007 16:04:11

gibts den keinen befehl oder keine möglichkeit bei einem ftp connect zu sagen lade bitte nur eine und zwar die neueste datei runter?!
Ich weiss nicht ob es hilft, aber "ncftpget" kennt die Option "-A", wodurch nur neue oder geänderte Dateien gedownloadet werden. Nutze ich für Up- und Download von und zu meinem Webspace.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von rendegast » 11.10.2007 16:32:12

Für curl gibt es einen Schalter '--list-only' (Äquivalent bei wget?), auf die Ausgabe ein 'tail -1', somit hast Du nur die letzte Datei.
Diese lädst Du mit einem zweiten wget- oder curl-Befehl

Code: Alles auswählen

wget -O usr_web2_1_latest.sql.gz ...
Zuletzt geändert von rendegast am 13.10.2007 18:21:10, insgesamt 3-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

FitzeFatze
Beiträge: 834
Registriert: 06.07.2004 10:08:21

Beitrag von FitzeFatze » 11.10.2007 17:57:56

a)wieso heißen deine backups "usr_web2_1_2007_10_09_23_59.sql.gz ". warum nicht nur backup.sql.gz. dann wuerde er automatisch die alte ueberschreiben. problem: du haettest auch nur ein backup auf dem server.

b)willst du prinzipiell server - server syncen oder nur dann wenn du lust hast? eigentlich MUSS es so eine syncloesung geben, da es bestimmt sehr viele machen, vllt hilft das : http://www.linux-schulserver.de/module- ... 5483.phtml


ciao

Benutzeravatar
Simmel
Beiträge: 698
Registriert: 08.03.2004 14:43:43
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von Simmel » 11.10.2007 18:07:26

red171 hat geschrieben:genau das geht leider nicht.


gibts den keinen befehl oder keine möglichkeit bei einem ftp connect zu sagen lade bitte nur eine und zwar die neueste datei runter?!
hmh, könntest du nicht in deinem Script einfach eine Abfrage einbauen, die checkt welches die letzte Datei ist die geladen werden soll? Ich meine, der Aufbau ist ja der gleiche? D.h. du listet die Dateien vorher auf und anhand der Datumsanzeige selektiert dann dein Skript das richtige raus und übergibt nur den korrekten Wert ans wget oder ftp Programm?

Nur mal so als Idee........
you've got to know how far to go in going too far

perl -le'print+(split//,"schaeuble")[6,8,7,3,5,0..2,4]'

http://creativecommons.org/licenses/by-nc-sa/2.0/

bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bRun0 » 11.10.2007 18:43:06

FitzeFatze hat geschrieben:a)wieso heißen deine backups "usr_web2_1_2007_10_09_23_59.sql.gz ". warum nicht nur backup.sql.gz. dann wuerde er automatisch die alte ueberschreiben. problem: du haettest auch nur ein backup auf dem server.
weil der mysqldumper die files so anlegt und ich keine möglichkeit habe diese struktur zu ändern.
FitzeFatze hat geschrieben:b)willst du prinzipiell server - server syncen oder nur dann wenn du lust hast? eigentlich MUSS es so eine syncloesung geben, da es bestimmt sehr viele machen, vllt hilft das : http://www.linux-schulserver.de/module- ... 5483.phtml
jain.

die backups werden 2x täglich erstellt. einmal mittags und einmal nachts (wie unschwer an den files zu erkennen ist)

eine synclösung gibt es einige, ich möchte aber nicht 5verschiedene backups machen, das backup welches mysqldumper erstellt hat einen sinn welchen ich jetzt nicht näher beschreiben möchte, ich hab halt 5files in dem ordner liegen und ich möchte immer nur das neueste file downloaden. mehr nicht..

Simmel hat geschrieben:hmh, könntest du nicht in deinem Script einfach eine Abfrage einbauen, die checkt welches die letzte Datei ist die geladen werden soll? Ich meine, der Aufbau ist ja der gleiche? D.h. du listet die Dateien vorher auf und anhand der Datumsanzeige selektiert dann dein Skript das richtige raus und übergibt nur den korrekten Wert ans wget oder ftp Programm?

Nur mal so als Idee........
danach frag ich doch die ganze zeit. wenn ich wüste wie ich solch eine abfrage gestalte, würd ich nich nach fragen und ganze hätte sich schon längst erledigt
:roll:

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von rendegast » 13.10.2007 18:22:01

Wie Simmel vorschlägt,
die Namensstruktur ist ja bekannt und muss nur passend der Tageszeit konstruiert werden:

Code: Alles auswählen

ARR=( `date '+%Y %m %d %H %M'` `)                                      # "Date-Array"
reserv=03

# vormittags:
DATE=${ARR[0]}_${ARR[1]}_$(( ${ARR[2]} - 1))                       # gestern
TARGETTIME=11_59
[  ${ARR[3]}${ARR[4]}  -gt  00$reserv  ]  &&  TARGETTIME=23_59

# nachmittags:
[  ${ARR[3]}${ARR[4]}  -gt  12$reserv  ]  &&  {
         TARGETTIME=11_59;
         DATE=${ARR[0]}_${ARR[1]}_${ARR[2]};  }                      # heute

wget  ...  .../usr_web2_1_${DATE}_${TARGETTIME}.sql.gz  -O Latest.sql.gz
(klappt so halt nicht während der ersten 12 Stunden des Monats bzw. für das letzte Backup des Monats ;-)
gibt aber der Backup-Erstellung eine '$reserv'-Minuten-Reserve)


siehe auch 'man bash' (-> Arrays), 'man date', 'man wget'
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

bRun0
Beiträge: 43
Registriert: 28.01.2006 23:58:10
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von bRun0 » 13.10.2007 20:22:28

hey rendegast

mit deinen beispiel script hast du mir auf jeden fall schonmal übelst geholfen =)


habs jetzt so;

Code: Alles auswählen

#!/bin/bash
cd /var/www/mysqldumper/work/backup

DARR=( `date '+%Y %m %d %H %M'`)  # "Date-Array"
reserv=03

# vormittags:
DATE=${DARR[0]}_${DARR[1]}_$(( ${DARR[2]} - 1)) # gestern
TARGETTIME=11_59
[  ${DARR[3]}${DARR[4]}  -gt  00$reserv  ]  &&  TARGETTIME=23_59

# nachmittags:
[  ${DARR[3]}${DARR[4]}  -gt  12$reserv  ]  &&  {
         TARGETTIME=11_59;
         DATE=${DARR[0]}_${DARR[1]}_${DARR[2]}; 
} #heute

		  
# backup mit wget holen
wget -c -N -nv --user=USER --password=PASS ftp://meinedomain.de/html/msd1.23/work/backup/usr_web2_1_${DATE}_${TARGETTIME}.sql.gz

if [ -e usr_web2_1_${DATE}_${TARGETTIME}.sql.gz ]
	then
		nice -n 19 gunzip < usr_web2_1_${DATE}_${TARGETTIME}.sql.gz | nice -n 19 mysql -u SQLUSER -pSQLPASS usr_web2_1
		
		rm usr_web2_1_${DATE}_${TARGETTIME}.sql.gz
	else
		echo "Backup Datei nicht vorhanden..";
fi

exit 0;
kann man das so lassen oder ist da was dran auszusetzen? :D

(ich arbeite nicht oft mit dem if / then / else / fi kram)

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von rendegast » 13.10.2007 21:27:29

Die zwei User mit Passwort im Skript sind vielleicht nicht so gut,
aber für quik+dirty macht es wohl, was es soll.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 14.10.2007 09:04:37

rendegast hat geschrieben:Die zwei User mit Passwort im Skript sind vielleicht nicht so gut,
aber für quik+dirty macht es wohl, was es soll.
Das stimmt schon, aber wenn man den Benutzernamen und das Passwort in einer separaten Datei speichert und aus dieser auslesen würde, wäre das dann besser?

Ok, wenn diese Daten noch von anderen Skripten benötigt werden, wäre es wohl sinnvoll die Daten in einer Datei zentral zu speichern, um bei einer Passwortänderung nur die eine Datei bearbeiten zu müssen.
Oh, yeah!

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 14.10.2007 11:39:55

hi,

die "offizielle" Datei für ftp-Passwörter ist ~/.netrc und die ist normal
nur für den Eigentümer lesbar.

Gut, das könnte man mit dem Script auch machen. Aber während
ein Befehl daraus ausgeführt wird, kann jeder mit "ps axu" oder
"cat /proc/$PID/cmdline" das Passwort lesen 8O
Beware of programmers who carry screwdrivers.

Antworten