Automatischer Download von Dateien über SCP unter Windows (mittels WinSCP)


Gerade erst hatte ich beschrieben, wie ein Download per FTP unter Windows automatisierbar ist, zum Beispiel für Backup-Zwecke. Aber so ganz glücklich bin ich mit dieser Methode nicht: Ein Backup von wichtigen Dateien über ein unsicheres Protokoll wie FTP ist nicht gerade das, was ruhig schlafen lässt. Zwar könnte FTPS oder FTPES zum Einsatz kommen, aber das wird nicht vom Standard-FTP-Kommandozeilen-Client von Windows unterstützt. Entsprechende Drittprogramme waren entweder nicht frei oder nicht für die Kommandozeile geeignet.

Aber wenn ein Zugang per SSH zum Server besteht, kann der Download auch über SCP erfolgen und somit verschlüsselt ablaufen. Dafür bietet sich der Einsatz von WinSCP an, einem freien Open-Source-SFTP-Client für Windows.

Um das ganze zu automatisieren, legen wir wieder eine Batch-Datei an, die den Download startet. Folgende Batch-Datei startet WinSCP mit den richtigen Parametern:

@echo off
C:
cd \Programme\WinSCP
winscp.exe /console /script=E:\Backups\Server\SCP_ANWEISUNGEN.txt /log=E:\Backups\Server\SCP_BACKUP.log

Auch hier werden die eigentlichen Anweisungen für WinSCP in eine extra Datei gespeichert. In obigem Beispiel ist das die Datei E:\Backups\Server\SCP_ANWEISUNGEN.txt. Diese enthält folgendes:

option batch on
option confirm off
open USER:_PASSWORD_@HOST
cd REMOTE_DIR
option transfer binary
get * LOCAL_DIR\*
close
exit

Hier müssen die Werte in Großbuchstaben angepasst werden, also USER, PASSWORD, HOST, REMOTE_DIR und LOCAL_DIR. Damit werden alle Dateien in REMOTE_DIR in das Verzeichnis LOCAL_DIR heruntergeladen.

Das Kommunikations-Log wird dabei von WinSCP in die Datei E:\Backups\Server\SCP_BACKUP.log gespeichert. Kommt es zu Fehlern, kommt man diesem meist recht schnell durch das Log auf die Schliche.

Automatisches FTP-Backup unter Windows


Hinweis: Diese Methode ist unverschlüsselt und sollte daher nicht für wichtige Dateien verwendet werden! Wenn Zugriff per SSH besteht, ist diese Methode über SCP vorzuziehen!

Folgende Batch-Datei ist ein Äquivalent zu diesem Shell-Skript. Es lädt alle Dateien von einem FTP-Server herunter. Damit kann zum Beispiel ein automatisches Backup eingerichtet werden.

Unter Windows (XP in diesem Fall) erzeugt man dazu eine Batch-Datei mit folgendem Inhalt (z.B. ftp_backup.bat):

@echo off
E:
cd \Backups\Server
ftp -i -s:E:\Backups\FTP_ANWEISUNGEN.txt

Dies wechselt in das Verzeichnis, in dem später die heruntergeladenen Dateien landen sollen (hier E:\Backups\Server). Für den Download wird das interne FTP-Progrämmchen von Microsoft verwendet. Was das FTP-Programm tun soll, muss in einer zweiten Datei notiert und per Option übergeben werden. In obigem Beispiel ist das die Datei E:\Backups\FTP_ANWEISUNGEN.txt.
Diese hat für einen Download aller Dateien folgenden Inhalt:

open FTPHOST
USERNAME
PASSWORD
binary
mget *
quit

Natürlich müssen hier noch die entsprechenden Werte für FTPHOST, USERNAME und PASSWORD eingetragen werden. Das ganze schaltet dann in den binären Übertragungsmodus und lädt jede Datei in das aktuelle Verzeichnis herunter. Dabei werden schon bestehende, lokale Dateien überschrieben.

Das kann man dann in der Systemsteuerung noch über einen automatischen Task zeitgesteuert starten lassen oder einfach eine Verknüpfung in den Autostart-Ordner legen, wenn der Rechner jeden Tag neu gestartet wird.

Fehler in proftpd mit SQL-Authentifizierung nach dem letzten Update unter Debian Etch


Wer einen FTP-Server unter Debian (Etch) betreibt, wird nach dem letzten Update vielleicht Fehlermeldungen in seinen Logs bemerken, wenn die Authentifizierung über virtuelle Benutzer und einer SQL-Datenbank läuft. Zwar funktioniert der Login mit jedem User einwandfrei, trotzdem gibt es bei jedem Login folgende Meldung:

PAM(NAME): User not known to the underlying authentication module.


Shell-Skript zum automatischen FTP-Download

Kategorie Code 11.04.2008    Kategorie Code Code    Tags ftp, script, shell    Kommentare 0 Kommentare

Mal ein kleines Shell-Skript als Notiz, muss man ja net immer neu schreiben:

#!/bin/bash

ftp -pvin FTPSERVER < < END_SCRIPT
quote USER FTPUSER
quote PASS FTPPASSWORD
cd FTPDIR
lcd LOCALDIR
mget *
bye
END_SCRIPT

Die FTP-Platzhalter austauschen (FTPSERVER, FTPUSER, FTPPASSWORD, FTPDIR und LOCALDIR), das Skript ausführbar machen und evtl. als Cron Job eintragen. Das Teil lädt einfach alle Dateien in FTPDIR runter nach LOCALDIR.

Inkrementelle Backups auf "öffentlichem" FTP-Server

Kategorie Code 17.03.2008    Kategorie Code Code    Tags backup, ftp    Kommentare 2 Kommentare

Sehr oft stellen Anbieter von Root-Servern oder vServern Backup-Platz auf einem FTP-Server im gleichen Subnetz zur Verfügung, also innerhalb des Rechenzentrum, in dem die eigene Kiste steht. Das Problem dabei: Der eigene Backupplatz dort ist nicht vor den Augen Dritter sicher, so kann der Anbieter selbst bzw. der Admin des Backup-Rechners mal vorbei gucken oder vielleicht gibts sogar einen Fehler im FTP-Server oder dem Netzsegment und die Daten stehen sperrangelweit offen (Fehler sind menschlich und passieren auch in den besten Umgebungen).

Natürlich möchte man nicht, dass alle Daten, ob Mails, Webseiten, SQL-Dumps oder Konfigurationsdateien einfach so offen liegen.

Des weiteren muss man natürlich auch regelmäßig Backups machen, damit diese was nützen. Dabei sollten diese aber wenig Platz verbrauchen. Meist hat man nur recht geringen Platz zur Verfügung (30 bis 50 GB sind so der Durchschnitt bei den meisten Anbietern nach meinen Erfahrungen).

Alle beiden Dinge kann man relativ simpel lösen: Duplicity!

Duplicity ist ein Programm, dass verschlüsselte, inkrementielle Backups erstellen und diese dann zum Beispiel auf FTP-Servern speichern kann. Duplicity ist im Debian-Repository (und auch in (K)Ubuntu) enthalten und kann einfach installiert werden:

sudo aptitude install gpg
sudo aptitude install duplicity

Nun kann man schon Backups erzeugen:

FTP_PASSWORD=secret duplicity /home/exampleuser ftp://backupuser@backup.example.com/subdirectory

Beim ersten Lauf wird ein Vollbackup erzeugt, erst bei erneutem Aufruf werden dann inkrementielle Backups erzeugt.

Mit dem Parameter --exclude kann man Verzeichnisse vom Backup ausschließen. Backups wiederherstellen geht auch relativ simpel:

FTP_PASSWORD=secret duplicity ftp://backupuser@backup.example.com/ /home/exampleuser

Allerdings kann man dies so noch nicht automatisiert verwenden (z.B. in Cron Jobs). Duplicity benötigt ein Passwort zur Verschlüsselung und fragt so jedesmal nach. Damit das reibungslos geht, müssen wir erstmal in GnuPG einen Schlüssel dafür anlegen.

debianserver:/home/exampleuser# gpg --gen-key

Ob das ganze richtig funktioniert hat, kann man einfach nachprüfen: gpg --list-keygibt eine Liste der Schlüssel aus. Da sollte der gerade angelegte mit den richtigen Daten dabei sein.

So, nun können wir uns ein kleines Skript schreiben, das den eigentlichen Aufruf von duplicity übernimmt:
#!/bin/bash

export PASSPHRASE=secret
export FTP_PASSWORD=ftpsecret

duplicity --encrypt-key "9D6F907C" --sign-key "9D6F907C" \
    --exclude /proc \
    --exclude /dev \
    --exclude /sys \
    --exclude /swap \
    / ftp://user@backup-server.de/

Natürlich muss man hier noch Anpassungen vornehmen. Als PASSPHRASE wird das Passwort für die GPG-Verschlüsselung eingetragen, das wir auch oben bei der Erstellung verwendet haben. Als encrypt-key und sign-key trägt man die ID des Schlüssels ein (das ist oben in rot markiert). Zur Erhöhung der Sicherheit kann man auch zwei unterschiedliche Schlüssel verwenden. Die FTP-Daten muss man entsprechend den Daten anpassen, die man von seinem Anbieter bekommen hat.
Auch sollte man sich überlegen, welche Verzeichnisse man genau ausklammern will und entsprechende Zeilen hinzufügen.

In diesem Beispiel wird die komplette Verzeichnisstruktur bis auf die paar mit exclude ausgenommenen Verzeichnisse gesichert (dafür ist das / in der letzten Zeile verantwortlich). Ob man wirklich so umfangreiche Sicherungen will, ist je nach Situation unterschiedlich. Darüber sollte man durchaus erstmal nachdenken und das Für und Wider einer großen, allgemeinen zu einer kleinen, speziellen Sicherung abwägen.

Wer will, kann sich das Ergebnis immer per Mail zuschicken lassen (dazu einfach | mail -s "duplicity backup" root@pumuckl-fanclub.de hinten dran anhängen). Wer sich aber Ergebnisse von Cron-Jobs eh per Mail zuschicken lässt (MAILTO-Anweisung in der crontab) kann darauf verzichten, da er diese Ergebnisse sowieso bekommt.

Als letzten Schritt speichert man obiges Skript z.B. unter /usr/local/bin/ftpbackup und macht dies mit chmod +x /usr/local/bin/ftpbackup ausführbar. Dann editiert man mit
crontab -e die Crontab von root (vorher evtl. mit sudo su auf root wecheln). Das Skript muss als root laufen, wenn wie im obigen Beispiel die gesamte Verzeichnisstruktur gesichert werden soll. Soll nur z.B. ein Homeverzeichnis eines bestimmten Benutzers gesichert werden, reicht es auch aus, den Aufruf in die crontab dieses Nutzers einzutragen.
Wie dem auch sei, man trägt eine Zeile für das Backup ein:

27 5 * * * /usr/local/bin/ftpbackup

Diese Zeile bewirkt, dass jeden Tag frühs um 05:27 Uhr das Backup gestartet wird.

Das sollte reichen. Jetzt startet man am besten erstmal manuell ein Backup, da das erste ja ein Full Backup wird und somit relativ lange dauern dürfte. In Zukunft kommen dann inkrementielle Backups hinzu.

Noch ein Tipp:
Mit folgender Zeile kann man sich den Restplatz auf dem FTP-Backup-Server anzeigen lassen (allerdings ist dieser Tipp nicht auf meinen Mist gewachsen, sondern das habe ich irgendwo aufgeschnappt, weiß aber leider die Quelle nicht mehr. Dennoch ein Dank an dieser Stelle an Unbekannt dafür Wink ):

echo du . | lftp -u FTPUSER,FTPPASSWORT FTPSERVER | awk -v LIMIT="50" '$1~/[0-9]+/ {QUOTA=LIMIT*1024*1024; print (QUOTA-$1)/1024/1024 " GB left"}'

Natürlich müssen die Werte an die Werte der eigenen Umgebung angepasst werden. Als LIMIT wird der vom Anbieter zugewiesene Platz in GB genannt, in diesem Fall 50 GB. Das ganze kann man auch (ähnlich wie oben) als Skript verpacken, z.B. unter /usr/local/bin/ftpbackupleft o.ä.