Benutzer-Werkzeuge

Webseiten-Werkzeuge


dev:shelltricks

Dies ist eine alte Version des Dokuments!


Shell-Tricks

Migration Webspace

Mirroring via rsync

Sofern der Fremd-Host den Zugang via SSH unterstützt und rsync installiert hat, können Sie Ihre Dateien ganz einfach rekursiv via Rsync synchronisieren resp. migrieren.

Anhand dieses Beispiels synchronisieren Sie das gesamte Verzeichnis public_html/www von Ihrem Fremd-Host in Ihr lokales public_html/www:

$ rsync -aAHXS -e ssh --numeric-ids --delete username@remotehost:public_html/www/ public_html/www

Um echte 1:1 Synchronisation zu gewährleisten, verwenden wir stets folgende Optionen, vgl. man rsync:

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-A, --acls                  preserve ACLs (implies -p)
-H, --hard-links            preserve hard links
-X, --xattrs                preserve extended attributes

Mirroring via lftp

Unterstützt Ihr Fremd-Host den Zugang via SSH und rsync, sollten Sie in jedem Fall rsync dem hier beschriebenen Tool lftp vorziehen. Verwenden Sie die Synchronisation via FTP mit lftp nur, wenn Sie kein rsync einsetzen können!

Um ein komplettes Verzeichnis rekursiv via FTP von einem Fremd-Hoster in Ihr Web-Verzeichnis zu synchronisieren, verwenden Sie am besten lftp. Unsere LFTP-Version unterstützt GnuTLS, d.h. es wird automatisch erkannt, ob der Fremd-Hoster eine verschlüsselte Verbindung via FTPS (FTP via SSL/TLS) unterstützt. Dank dem Standard-Konfigurationsparameter ftp:ssl-allow = true wird automatisch SSL/TLS gewählt.

$ lftp -v
LFTP | Version 4.3.6 | Copyright (c) 1996-2012 Alexander V. Lukyanov
Libraries used: Readline 6.2, GnuTLS 2.12.20, zlib 1.2.7

Beispiel unter folgender Annahme:

Variable Beschreibung
USERNAME FTP-Benutzername des externen Hosters
PASSWORD FTP-Passwort des externen Hosters
HOSTNAME FTP-Server des externen Hosters
SRCDIR path to source directory (auf externem FTP)
DSTDIR path to destination directory (lokal, auf unserem Webserver, wo Sie lftp ausführen)
$ lftp -u USERNAME,PASSWORD -e "mirror -c --delete --verbose SRCDIR DSTDIR" HOSTNAME

Ein etwas konkreteres Beispiel:

$ lftp -u myuser,myPa55w0rd -e "mirror -c --delete --verbose public_html/www public_html/www/" ftp.example.com
Achten Sie bitte darauf, dass Sie die korrekten Pfade unter SRCDIR resp. DSTDIR wählen. SRCDIR ist relativ vom root-Verzeichnis, in welchem Sie sich befinden, sobald Sie sich mit dem FTP-Benutzer anmelden. DSTDIR ist relativ vom ausgeführten lftp-command.
Wichtig ist die option -c, sozusagen ein „resume/syncing“ nach abgebrochenem mirroring. Vgl. man lftp:
-c,    --continue                continue a mirror job if possible
-e,    --delete                  delete files not present at remote site

Migration Mailaccounts

imapsync

Grössere Mailkonten-Daten von Ihrem bisherigen Webhoster zu übernehmen kann sehr umständlich sein. Insbesondere wenn Sie über eine grosse Anzahl Mailkonten verfügen oder wenn Sie einzelne Mailkonten mit mehreren GB belegt haben - eine manuelle Migration scheint oft ein Ding der Unmöglichkeit.

Onlime Webhosting bietet Ihnen ein professionelles Migrationstool, das Ihnen all die manuelle Arbeit abnimmt und solche Migrationen auf einfache Weise erledigen lässt: Imapsync

Die Migration eines einzelnen Mailaccounts geht ganz einfach:

$ imapsync --host1 imap.oldhost.tld --ssl1 --port1 993 --authmech1 PLAIN --user1 old_user        --password1 oldPassword1234 \ 
           --host2 imap.onlime.ch   --ssl2 --port2 993 --authmech2 PLAIN --user2 new@example.com --password2 newPasswordXYZ 
Unterstützt Ihr bisheriger Anbieter keine verschlüsselte IMAP-Verbindung via SSL/TLS, passen Sie dies wie folgt an:
$ imapsync --host1 imap.oldhost.tld        --port1 143 --authmech1 PLAIN --user1 old_user        --password1 oldPassword1234 \ 
           --host2 imap.onlime.ch   --ssl2 --port2 993 --authmech2 PLAIN --user2 new@example.com --password2 newPasswordXYZ 

Migration mehrerer Mailaccounts

Für die automatische Migration mehrerer Mailaccounts haben wir ein Script vorbereitet. Speichern Sie dieses z.B. in die Datei imapsync.sh und passen Sie den Quellhost Ihres bisherigen Hosting Providers an (SRCHOST=imap.example.com):

#!/bin/bash
 
############# CONFIGURATION ###########
ACCOUNTS=accounts.list
SRCHOST=imap.example.com
DSTHOST=imap.onlime.ch
#######################################
 
EXTRALOG=sync.log
TSFORMAT="%Y-%m-%d %H:%M:%S"
 
# loop through all accounts
grep -ve '^#.*' $ACCOUNTS | while read SRCUSER SRCPW DSTUSER DSTPW
do
    MESSAGE="[`date +"$TSFORMAT"`] synchronizing $SRCUSER@$SRCHOST to $DSTUSER@$DSTHOST ..."
    echo $MESSAGE
    echo $MESSAGE >> $EXTRALOG
 
    # security: temporarly store passwords to files in order 
    # not to pass them directly by command line option
    echo -n $SRCPW > imap-secret-src
    echo -n $DSTPW > imap-secret-dst
 
    ## VARIANT 1) source host supports SSL/TLS (imap port 993)
    imapsync --host1 $SRCHOST --ssl1 --port1 993 --authmech1 PLAIN --user1 $SRCUSER --passfile1 imap-secret-src \
             --host2 $DSTHOST --ssl2 --port2 993 --authmech2 PLAIN --user2 $DSTUSER --passfile2 imap-secret-dst
 
    ## VARIANT 2) source host does not support SSL/TLS (imap port 143)
    #imapsync --host1 $SRCHOST        --port1 143 --authmech1 PLAIN --user1 $SRCUSER --passfile1 imap-secret-src \
    #         --host2 $DSTHOST --ssl2 --port2 993 --authmech2 PLAIN --user2 $DSTUSER --passfile2 imap-secret-dst
 
    ## VARIANT 3) source host has different INBOX prefix, transform it while syncing
    #imapsync --host1 $SRCHOST --ssl1 --port1 993 --authmech1 PLAIN --user1 $SRCUSER --passfile1 imap-secret-src \
    #         --host2 $DSTHOST --ssl2 --port2 993 --authmech2 PLAIN --user2 $DSTUSER --passfile2 imap-secret-dst --regextrans2 "s/INBOX.INBOX/INBOX/"
 
    rm -f imap-secret-*
done
 
MESSAGE="[`date +"$TSFORMAT"`] imapsync sucessfully completed!"
echo $MESSAGE
echo $MESSAGE >> $EXTRALOG
exit 0

Machen Sie das Script ausführbar:

$ chmod u+x imapsync.sh

Die zu migrierenden Mailkonten definieren Sie in der Datei accounts.list. Pro Zeile geben Sie jeweils die Zugangsdaten des alten Mailaccounts gefolgt von den Zugangsdaten des neuen Accounts an, jeweils separiert durch einen Leerschlag:

# <SRCUSER> <SRCPW> <DSTUSER> <DSTPW>
old_user oldPassword1234 new@example.com newPasswordXYZ
old2 xyz123 new2@example.com xyz456

Lassen Sie nun das Migrations-Script imapsync.sh rattern:

$ ./imapsync.sh
Sie können das Script ruhig auch mehrfach ausführen, um neu hinzugekommene E-Mails erneut zu synchronisieren. Es werden dabei nur die veränderten Daten übernommen.

Bei der Migration mit imapsync werden auch alle IMAP-Flags (Answered, Flagged, Deleted, Seen etc.) übernommen. Aus dem README:

imapsync is a good tool because it reduces the amount of data transferred by not transferring a given message if it is already on both sides. Same headers and the transfer is done only once. All flags are preserved, unread will stay unread, read will stay read, deleted will stay deleted. You can stop the transfer at any time and restart it later, imapsync works well with bad connections.

Sehr komfortabel! Unsere Erfahrung mit imapsync während den letzten Jahren ist durchwegs positiv.

Wir empfehlen Ihnen, imapsync.sh in einer screen-Session laufen zu lassen, denn so können Sie jederzeit die Session verlassen, ohne dass das Script abbricht:
$ screen
$ ./imapsync.sh

Verlassen der screen-Session (detach):

Ctrl-A D

Wiederaufnehmen der screen-Session (reattach):

$ screen -r

Kümmern Sie sich nicht um den Output von imapsync.sh - dieser dient nur zur Info. Den gesamten Output finden Sie auch in den Logdateien, welche automatisch angelegt werden:

sync.log
LOG_imapsync/YYYY_MM_DD_HH_MM_SS_user1.txt
LOG_imapsync/YYYY_MM_DD_HH_MM_SS_user2.txt

Rekursives Search-Replace

sed

Jeder kennt sed, den standard „stream editor“, welcher auf jedem Unix/Linux-System verfügbar ist. Damit lassen sich search-replaces einfach auf einzelne Dateien anwenden:

$ sed -i 's/fooBar/myReplacement/g' demo.php

Verwendete Parameter, vgl. man sed:

-i[SUFFIX], --in-place[=SUFFIX]
       edit files in place (makes backup if extension supplied)

Um das Ganze nun noch rekursiv zu machen, verwenden wir find:

$ find . -type f -exec sed -i 's/fooBar/myReplacement/g' {} \;
Bevor wir ein rekursives search-replace mit obigem Command absetzen, sollte stets überprüft werden, ob dieser auf die korrekten Dateien angewendet wird. Vorgängig also bitte find ausführen, ohne search-replacing:
$ find . -type f

Wir empfehlen Ihnen auch, die Dateien vorgängig rekursiv nach dem Such-String abzusuchen mit grep:

$ grep -r 'fooBar' .

rpl

rpl ist ein hervorragendes Tool für rekursive search-replaces. Beispiel:

$ rpl -Rds "relaunch.example.com" "www.example.com" .

Verwendete Parameter, vgl. man rpl:

-R, --recursive
        Recurse into subdirectories.
-d, --keep-times
        Keep modification times when replacing files.
-s, --dry-run
        Simulation mode, no files are changed.

Wir führen nun also den simulation mode aus und schreiben den gesamten Output in die Datei rpl.dump, damit wir diese ausführlich durchstudieren können:

$ rpl -Rds "relaunch.example.com" "www.example.com" . > rpl.dump 2>&1

Danach führen wir den search-replace produktiv aus (ohne dry-run):

$ rpl -Rd "relaunch.example.com" "www.example.com" .
Falls versteckte „.“ Dateien (z.B. .htaccess, .htpasswd, .svn) ebenfalls einbezogen werden sollen, verwende -a:
$ rpl -aRd "relaunch.example.com" "www.example.com" .
dev/shelltricks.1410527113.txt.gz · Zuletzt geändert: 2014/09/12 15:05 von phi