Automatischer Cronjob

Kirschi

Admiral Special
Mitglied seit
23.07.2002
Beiträge
1.814
Renomée
4
Standort
Franken
Hallo zusammen,

ich als Nicht-Experte im Bereich Linux möchte einen Cronjob erstellen welcher 1 mal täglich meine ownCloud Installation mitsamt Datenbank auf einen externen FTP Server sichert.

Meine Idee hierzu war, erst die Dateien in ein temporäres Verzeichnis zu kopieren, die mySQL Datenbank zu sichern, das ganze zu Packen und dann auf den FTP Server hochzuladen.

Code:
cp -a /var/www/. /root/tmp; mysqldump --lock-tables -h localhost -u user1 -p'PWmitSonderzeichen' DBname > /root/tmp/DBBackup_db.bak; zip -r /root/backup/Backup_'date +%Y%m%d'.zip /root/tmp/;

Das funktioniert soweit, allerdings wird das Zip File nicht, wie gewünscht, mit Datum versehen, sondern es heißt dann "OC_Backup_date +%Y%m%d.zip". Was mache hier falsch? Die zweite Frage wäre, wie ich das Zip File auf den FTP Server bekomme. Nach erfolgreichem Upload sollen dann die Dateien aus dem temporären Verzeichnis entfernt werden. Idealerweise sollte ich dann natürlich noch eine Email bekommen ob das alles funktioniert hat.

Kann ich das alles in einem Befehl in die Crontab schreiben?

Wäre toll, wenn Ihr mir weiterhelfen könntet.
Kirschi
 
Das funktioniert soweit, allerdings wird das Zip File nicht, wie gewünscht, mit Datum versehen, sondern es heißt dann "OC_Backup_date +%Y%m%d.zip". Was mache hier falsch?
Das Prozentzeichen in einer crontab bedeutet grundsätzlich einen Zeilenumbruch. Grundsätzlich muss man die also maskieren, mit einem Backslash wie bei Linux üblich. In deinem Fall wird die Sache durch die benutzten einfachen Anführungszeichen offensichtlich nochmal anders behandelt. Kann es sein, dass du dort Backticks setzen wolltest? Das ist ein Anfängerfehler, zumal die in jedem zweiten Tutorial immer noch vorkommen, obwohl es seit langer Zeit schon bessere Varianten gibt: "$(befehl)" statt "`befehl`".

Die zweite Frage wäre, wie ich das Zip File auf den FTP Server bekomme. Nach erfolgreichem Upload sollen dann die Dateien aus dem temporären Verzeichnis entfernt werden. Idealerweise sollte ich dann natürlich noch eine Email bekommen ob das alles funktioniert hat.

Kann ich das alles in einem Befehl in die Crontab schreiben?
Meine Empfehlung: Vergiss es, das alles in die Crontab schreiben zu wollen, das ist viel zu unübersichtlich. Schreib dir ein Skript, das "schön" geschrieben ist und trage dieses in die Crontab ein. Mal ein Beispiel mit dem Vorgegebenen:
Code:
#!/bin/sh

cp -a /var/www/. /root/tmp
mysqldump --lock-tables -h localhost -u user1 -p'PWmitSonderzeichen' DBname > /root/tmp/DBBackup_db.bak
zip -r "/root/backup/Backup_$(date +%Y%m%d).zip" /root/tmp/
rm -f /root/tmp
Übrigens ist es nicht besonders clever, Passwörter im Klartext in einer ungesicherten Datei stehen zu haben, sei es nun die crontab oder ein Skript. Für MySQL bietet sich hierfür die .my.cnf im Home des jeweiligen Nutzers an, deren Rechte man natürlich so anpasst, dass niemand außer dem Nutzer sie lesen kann.

MfG Dalai
 
Ok, das hilft mir weiter. Vielen Dank. Kannst Du mir noch einen Tipp geben, wie ich die Passwörter schützen kann?
 
Kannst Du mir noch einen Tipp geben, wie ich die Passwörter schützen kann?
Wie schon gesagt: ~/.my.cnf. Formatiert wird die folgendermaßen:
Code:
[client]
user = user
password = passwort
Mehr Infos dazu gibt's auch im Netz, wenn man nach ".my.cnf password" sucht, z.B. hier oder hier. Wichtig dabei: die Datei nach dem Anlegen mit passenden Rechten ausstatten, also 0600 bzw. rw-------.

Ach, noch ein Tip: Sei vorsichtig mit dem Nutzer root. Man braucht keine Root-Rechte auf dem System, um sich mit dem MySQL-Nutzer root anzumelden, denn die beiden haben nichts miteinander zu tun, weil die Nutzer im MySQL völlig andere sind als die im System.

MfG Dalai
 
Super, Danke Dir. Wie sieht es mit den anderen Passwörtern aus? Also z.B. wenn ich in dem Script via FTP die Dateien hochladen möchte?

Der Inhalt der .my.cnf müsste bei mir dann aber wie folgt reichen, oder?

Code:
[mysqldump]
user=benutzername
password=passwort

Wie binde ich diese Datei dann in mein Script ein? Oder erkennt der mySQL Server diese automatisch?
 
Super, Danke Dir. Wie sieht es mit den anderen Passwörtern aus? Also z.B. wenn ich in dem Script via FTP die Dateien hochladen möchte?
Ach, stimmt, hab ich vergessen. Das geht ähnlich. Dafür gibt es eine Datei namens .netrc, die ebenfalls im Home des jeweiligen Nutzers liegt, aber einen anderen Aufbau hat:
Code:
machine rechnername_des_ftp login nutzername password passwort
Je Zeile ein (FTP-)Server. Die Datei muss ebenfalls mit entsprechenden Rechten (0600 oder 0400) geschützt werden, sonst verweigert das FTP-Kommando die Arbeit.

Der Inhalt der .my.cnf müsste bei mir dann aber wie folgt reichen, oder?

Code:
[mysqldump]
user=benutzername
password=passwort
Jep. Sofern dein Passwort Sonderzeichen hat, beherzige den (mir bisher ebenfalls unbekannten) Tip auf StackOverflow und setze es in doppelte Anführungszeichen.

Wie binde ich diese Datei dann in mein Script ein? Oder erkennt der mySQL Server diese automatisch?
Das passiert ganz automatisch, d.h. du brauchst keine Parameter anzugeben, damit die Datei benutzt wird.

MfG Dalai
 
Das mySQL Backup hat funktioniert.:) Leider kriege ich das mit der FTP Verbindung nicht hin. Ich habe die .netrc Datei angelegt und mit meinen Zugangsdaten hinterlegt.

Code:
machine 2xx.xx.xx8.xx7 login admin password "pwMitSonderzeichen"

und in meinem Script die folgende Zeile hinzugefügt

Code:
ftp -in ftp://2xx.xx.xx8.x7/Backup_Cloud/ /root/owncloud_backup/*.zip

Wenn ich das auf der Shell ausführe, bekomme ich folgende Meldung:

Code:
ftp://2xx.xx.xx8.x7/Backup_Cloud/: bad port number-- /root/owncloud_backup/test.zip
usage: -in host-name [port]

Das Passwort habe ich einmal mit "" und einmal ohne hinterlegt. Es kommt allerdings mit beiden Varianten die Fehlermeldung.

Edit: den ersten Fehler habe ich schon entdeckt, statt "ftp://" muss es wohl nur die FTP Server Adresse sein. Die Fehlermeldung bekomme ich trotzdem.
 
Zuletzt bearbeitet:
Tip: Probier erstmal nur die simple Verbindung auf einem Terminal, also so:
Code:
ftp serveradresse

MfG Dalai
 
Und der automatische Login klappt auch? Dann liegt es an den Parametern. Ich hab damals FTP verwendet, um die aktuelle IP-Adresse eines externen Servers auf meinen FTP hochzuladen; das ging so:
Code:
(echo cd $REMOTE_DIR; echo del $IP_FILE; echo put $IP_PATH $IP_FILE;
echo quit) | ftp externer_server
Man muss also ein paar FTP-Kommandos kennen, um den Krempel zu steuern ;).

MfG Dalai
 
Tendenziell würde ich für sowas auf keinen Fall ftp verwenden, sondern ssh. Dann am besten die Daten mit rsync senden, das unterstützt als Transport auch ssh.

Solche Einzeiler wie im ersten Post sind meistens eher dazu geeignet Bugs zu verstecken als ein Problem zu lösen. In dem Fall müsste der Aufruf von date wohl eher so lauten:
Code:
$(echo date +%Y%m%d)
 
Mein Script sieht jetzt so aus:

Code:
#!/bin/sh

cp -a /var/www/. /root/tmp
mysqldump --lock-tables -h localhost dbname > /root/tmp/dbname_db.bak
zip -8 -r "/root/owncloud_backup/Backup_$(date +%Y-%m-%d).zip" /root/tmp/
lftp -e "mput -O /Backup_Cloud /root/owncloud_backup/*.zip; bye" ftp.server.xx
# rm -f /root/tmp

SSH fällt leider vorerst weg, da auf dem Ziel FTP Server Windows läuft. Zur Perfektion fehlen mir jetzt eigentlich nur noch 3 Sachen:

1. eine geschützte Zip Datei. Das Zip File könnte ich ja Passwort schützen, aber dann steht das Passwort mit Cleartext im Script. Das will ich ja vermeiden. Gibts da sowas wie .my.cnf oder das .netrc File auch für Zip Dateien?
2. Kann ich mir von den im Script genannten Befehlen Logdateien erstellen lassen und ...
3. ... diese mir dann per Email zusenden lassen?
 
Auf dem ZielWindooofsystem könntest Du, falls Du darauf Zugriff hast, mit Leichtigkeit eine cygwin Umgebung installieren, worauf Du dann einen ssh oder rsync Daemon laufen lassen könntest und gleich mit Zertifikaten ohne irgendwo ein Kennwort einzutragen Daten übertragen könntest (Mach ich selbst so wo ich dieses sogenannte Betriebsystem verwenden muss).
-> https://www.cygwin.com/

Zum Verschlüsseln von Dateien die ich auf einen Cloudserver schiebe verwende ich persönlich gerne ccencrypt.

etwa so:
Code:
DATUM=$(date +%Y%m%d)

/usr/bin/mysqldump -A --opt --hex-blob --single-transaction | lbzip2 -c | ccencrypt -k /etc/backup_password > /var/db/dump/mysqldump-${DATUM}.sql.bz.cpt

/usr/bin/scp /var/db/dump/mysqldump-${DATUM}.sql.bz.cpt backupserver.de:

lg
__tom
 
Zuletzt bearbeitet:
SSH fällt leider vorerst weg, da auf dem Ziel FTP Server Windows läuft.
Es gibt auch SSH-Server für Windows, unabhängig vom genannten cygwin. Allerdings habe ich damit keinerlei Erfahrung.

1. eine geschützte Zip Datei. Das Zip File könnte ich ja Passwort schützen, aber dann steht das Passwort mit Cleartext im Script. Das will ich ja vermeiden. Gibts da sowas wie .my.cnf oder das .netrc File auch für Zip Dateien?
Muss es denn ZIP sein? Keine Ahnung, aber schau mal die Packer durch (gibt ja genügend), ob einer von denen eine solche Datei unterstützt. Sonst eben Toms Methode: Nach dem Packen verschlüsseln.

2. Kann ich mir von den im Script genannten Befehlen Logdateien erstellen lassen und ...
Selberbauen. Ist ja nicht weiter schwer, ein paar Ausgaben in eine Datei umzuleiten, ob die Befehle erfolgreich waren oder nicht.

3. ... diese mir dann per Email zusenden lassen?
Hier kommt es darauf an, wo der Mailserver steht, der zum Versenden benutzt werden soll. Intern oder extern? Aber da gibt es genügend Pakete, die sowas können. Schau mal z.B. auf dieser Seite vorbei: Autonome SMTP-Clients.

MfG Dalai
 
Zurück
Oben Unten