Viele Admins, die einen Root-Server besitzen, möchten gerne ihre Maps oder SourceTV-Demos mit einem Webserver über FTP abgleichen. Der FTP-Client lftp
bietet eine Vielzahl von Möglichkeiten. Das Synchronisieren ist eine der gewünschten Funktion.
Da das Programm lftp
standardmäßig nicht installiert ist, muss es über den Paketmanager der jeweiligen Distribution installiert werden.
apt-get update; apt-get install lftp
zypper install lftp
Da das Programm später über ein Script als Cronjob ausgeführt werden soll, ist es wichtig zu wissen, wie der FTP-Client funktioniert. Wenn man nur lftp ohne Parameter aufruft, kommt man in die Kommandozeile des FTP-Clients1).
Hilfe:
Benutzung: lftp [OPTS] <site>
»lftp« ist der erste Befehl, der von lftp nach den rc-Dateien ausgeführt wird.
-f <datei> Befehle aus diesem File ausführen und beenden
-c <bfehl> Befehle ausführen und beenden
Die anderen Optionen sind die selben wie beim »open« Befehl
-e <bfehl> den Befehl direkt nach der Auswahl ausführen
-u <user>[<passwt>] Benutze user und passwort zur Authentifikation
-p <port> Benutze den angegebenen Port zur Verbindung
<site> Name des Hosts, URL oder Name eines Lesezeichen
Der Befehl mirror:
Benutzung: mirror [OPTS] [nichtlokal [lokal]]
Das angegebene nichtlokale Verzeichnis in ein lokales Verzeichnis spiegeln
-c, –continue mit dem Spiegeln fortfahren, wenn möglich
-e, –delete Dateien die nicht auf dem entfernten Verzeichnis
liegen löschen
–delete-first alte Dateien vor der Übertragung neuer Dateien löschen
-s, –allow-suid SUID/SGID Berechtigungen setzen wie auf dem
Server
–allow-chown wenn möglich Benutzer und Gruppe setzen
-n, –only-newer nur neuere Dateien herunterladen (schließt -c aus)
-r, –no-recursion Unterverzeichnisse nicht mit einschließen
-p, –no-perms keine Dateiberechtigungen setzen
–no-umask umask nicht auf Dateiattribute anwenden
-R, –reverse umgedrehter Spiegel (Dateien schicken)
-L, –dereference symbolische Links als Files herunterladen
-N, –newer-than DATEI nur Dateien die neuer sind als DATEI herunterladen
-P, –parallel[=N] N Dateien gleichzeitig herunterladen
-i RA, –include RA zum regulären Ausdruck passende Dateien einschließen
-x RA, –exclude RA zum regulären Ausdruck passende Dateien
ausschließen
RA sind erweiterte reguläre Ausdrücke (Joker)
-v, –verbose[=N] mehr Informationen ausgeben
–log=DATEI ausgeführte lftp Befehle in DATEI protokollieren
–script=DATEI lftp Befehle in DATEI protkollieren, aber nicht
ausführen
–jusz.print, –dry-run entspricht »–script=-«
Gibt man -R an, so ist das erste Verzeichnis lokal und das andere auf dem
Gegenstelle.
Wird das zweite Verzeichnis nicht angegeben, wird die Namenswurzel(basename)
des ersten Verzeichnisses verwendet.
Werden beide Verzeichnisse weggelassen, so werden das aktuelle lokale und
nichtlokale Verzeichnis verwendet.
Das Quellverzeichnis sollte immer mit einem Schrägstrich enden, damit alle Dateien innerhalb des Verzeichnisses erfasst werden. Wird der Schrägstrich am Ende vergessen, wird das letzte Verzeichnis mit erstellt. Im Gegensatz zum Quellverzeichnis, sollte beim Zielverzeichnis der letzte Schrägstrich nicht verwendet werden.
Um SourceTV-Demos mit einem Webserver über FTP zu synchronisieren, werden nur die Dateien *.dem benötigt. Alles andere zu synchronisieren wäre ein Sicherheitsrisiko.
lftp -e "mirror -ceRr -i .*\.dem$ /home/gameserver/server1/cstrike/ /httpdocs/sourcetv_demos;quit" -u ftp_user:ftp_password ftp_host
In diesem Beispiel wird der Befehl
mirror -ceRr -i .*\.dem$ /home/gameserver/server1/cstrike/ /httpdocs/sourcetv_demos/
an lftp übergeben. Der Parameter -e
übergibt dem Programm lftp
den Befehl2).
Die Optionsschalter -ceRr des Befehls mirror
bewirken folgendes:
c
> mit dem Spiegeln fortfahren, wenn möglich3)e
> Dateien die nicht auf dem entfernten Verzeichnis liegen löschenR
> umgedrehter Spiegel (Dateien schicken)r
> Unterverzeichnisse nicht mit einschließen-i .*\.dem$
> selektiert alle Dateien mit der Endung *.dem
Um den Mappool abzugleichen, kann man selektierte Verzeichnisse auf den Webserver hochladen. Da die Befehlskette länger wird, ist es sinnvoll die Befehle mit einer Datei an lftp
zu übergeben.
lftp -f mappool_sync.txt
Hier wird die Datei mappool_sync.txt an lftp übergeben und lftp
führt diese dann aus.
mappool_sync.txt:
lftp -u ftp_user:ftp_password ftp_host mirror -eR /home/gameserver/server1/cstrike/maps/ /httpdocs/cstrike/maps mirror -eR /home/gameserver/server1/cstrike/materials/ /httpdocs/cstrike/materials mirror -eR /home/gameserver/server1/cstrike/models/ /httpdocs/cstrike/models mirror -eR /home/gameserver/server1/cstrike/sound/ /httpdocs/cstrike/sound quit
Wenn schon ein vorgefertigtes Script vorhanden ist, welches bz2-Dateien anfertigt aber noch andere unkomprimierte Dateien sich im Verzeichnis befinden, können mithilfe -i .*\.bz2$
die *.bz2-Dateien selektiert werden.
mappool_sync.txt:
lftp -u ftp_user:ftp_password ftp_host mirror -eR -i .*\.bz2$ /home/gameserver/server1/cstrike/maps/ /httpdocs/cstrike/maps mirror -eR -i .*\.bz2$ /home/gameserver/server1/cstrike/materials/ /httpdocs/cstrike/materials mirror -eR -i .*\.bz2$ /home/gameserver/server1/cstrike/models/ /httpdocs/cstrike/models mirror -eR -i .*\.bz2$ /home/gameserver/server1/cstrike/sound/ /httpdocs/cstrike/sound quit
Mit diesem Shell-Script kann automatisiert der Upload aller Demo-Dateien von SourceTV gestartet werden. Es arbeitet mit einer externen Konfigurationsdatei, die mit dem Befehl source
geladen wird.
Shell-Script [Download]:
#!/bin/bash if [ ! -f demo.cfg ]; then echo "Die Konfigurationsdatei demo.cfg wurde nicht gefunden"; exit; fi source demo.cfg if [ -z "$ftp_host" ]; then echo "FTP-Host fehlt in der Konfigdatei"; exit; fi if [ -z "$ftp_user" ]; then echo "FTP-Benutzer fehlt in der Konfigdatei"; exit; fi if [ -z "$ftp_password" ]; then echo "FTP-Passwort fehlt in der Konfigdatei"; exit; fi if [ -z "$dir_local" ]; then echo "Lokales Verzeichnis fehlt in der Konfigdatei"; exit; fi if [ -z "$dir_remote" ]; then echo "Verzeichnis auf dem Webserver fehlt in der Konfigdatei"; exit; fi echo -e "Beginne mit dem Spiegeln\n" echo "Host: $ftp_host" echo "User: $ftp_user" echo "Passwort: ****" echo echo "Lokales Verzeichnis: $dir_local" echo "Verzeichnis auf dem Webserver: $dir_remote" echo lftp -e "mirror -ceRr -i $extension $dir_local $dir_remote" -u $ftp_user:$ftp_password $ftp_host
Konfigurationsdatei [Download]:
# Beispiel: # #ftp_host=sourceserver.info #ftp_user=user123 #ftp_password=passwort123 #dir_local=/home/gs/server/war1_css/srcds/cstrike/ #dir_remote=/subdomains/maps/httpdocs/xyz/demos #extension=".*\.dem$" (regular expression. In diesem Beispiel alle Dateien mit der Endung .dem) # #Alle Angaben sind noetig, damit daas Script die Dateien und Verzeichnisse Spiegeln kann. ftp_host= ftp_user= ftp_password= dir_local= dir_remote= extension=".*\.dem$"