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.example.com --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 \
           --delete2 --delete2folders
Unterstützt Ihr bisheriger Anbieter keine verschlüsselte IMAP-Verbindung via SSL/TLS, passen Sie dies wie folgt an:
$ imapsync --host1 imap.example.com        --port1 143 --authmech1 PLAIN --user1 old_user        --password1 oldPassword1234 \ 
           --host2 imap.onlime.ch   --ssl2 --port2 993 --authmech2 PLAIN --user2 new@example.com --password2 newPasswordXYZ \
           --delete2 --delete2folders
ACHTUNG: Wenn Sie den neuen Mailaccount bei Onlime bereits nutzen und nachträglich erneut die Daten des bisherigen Mailaccounts synchronisieren möchten (z.B. nach einer Umstellung der MX records im DNS), sollten Sie die Parameter –delete2 und –delete2folders entfernen!
Ansonsten riskieren Sie, dass die neu eingegangenen E-Mails im neuen Mailaccount unwiederruflich gelöscht werden.
$ imapsync --host1 imap.example.com --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

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 \
             --delete2 --delete2folders
 
    ## 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 \
    #         --delete2 --delete2folders
 
    ## 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 \
    #         --delete2 --delete2folders --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" .

PHP fixes

short_open_tag

Short open tags (<? anstelle von <?php) sind veraltet und wurden bei Onlime Webhosting ab PHP 5.5 standardmässig deaktiviert. Sie sollten Ihre PHP-Webapplikation bereinigen und alle PHP short open tags ersetzen.

Wechseln Sie dazu in das gewünschte Verzeichnis (z.B. public_html/www/) und führen Sie ein rekursives Search-Replace aus:

$ find . -iname '*.php' -type f -print0 | xargs -0 sed -i -e 's/<? /<?php /g' -e 's/<?\/\//<?php \/\//g' -e 's/<?\/\*/<?php \/\*/g' -e 's/<?$/<?php/g'

Dieser Befehl macht in all Ihren PHP-Dateien mit Endung .php folgende Ersetzungen:

von nach
<? <?php
<?// <?php //
<?/* <?php /*
ACHTUNG! Sofern Sie Ihre PHP-Dateien im DOS/Windows-Format mit CRLF Zeilenenden abgespeichert haben, müssen Sie diese zuvor ins Unix-Format (empfohlen!) mit LF Zeilenenden umwandeln:
$ find . -iname '*.php' -type f -print0 | xargs -0 dos2unix

Ansonsten klappt es mit der Ersetzung von <?<?php vor Zeilenende nicht.

WP-CLI (Wordpress)

WP-CLI ist ein Kommandozeilen-Werkzeug, mit dem sich viele Aufgaben einer WordPress-Installation schnell und übersichtlich erledigen lassen.
Sie brauchen WP-CLI nicht selbst zu installieren, denn es ist bereits von uns auf dem Webserver installiert und wird laufend von Onlime gewartet, d.h. es steht Ihnen auch immer die aktuellste Version zur Verfügung. Verwenden Sie ganz einfach den command wp.

Anzeige WP-CLI Version

$ wp --info
WP-CLI version:	0.17.1

Wordpress Installieren

Wordpress lässt sich mit wp core ganz einfach installieren mit WP-CLI:

$ cd webhome/public_html/www/
$ rm -f default-index.php
$ wp core download

Sie können bei der Installation auch gleich einen anderen Pfad und/oder eine andere Sprachvariante angeben:

$ wp core download --path=/var/www/web123/public_html/relaunch --locale=de_DE

Migration / Search-Replace

Nachdem Sie eine Wordpress-Installation auf eine andere Subdomain verschieben (z.B. via unser Subdomain-Swapping im Controlpanel), sollten Sie danach umgehend alle Hostnames und Server-Pfade ersetzen. Mit wp search-replace ist dies ein Kinderspiel - WP-CLI behandelt dabei auch serialisierte Daten korrekt (was mit direkten SQL-Queries ein Ding der Unmöglichkeit wäre):

$ wp search-replace 'relaunch.example.com' 'www.example.com' --dry-run
$ wp search-replace '/var/www/web123/public_html/relaunch' '/var/www/web123/public_html/www' --dry-run

Sind Sie sich sicher, dass Sie das korrekte search-replace Muster gewählt haben, führen Sie den Befehl ohne Parameter –dry-run aus:

$ wp search-replace 'relaunch.example.com' 'www.example.com'
$ wp search-replace '/var/www/web123/public_html/relaunch' '/var/www/web123/public_html/www'
dev/shelltricks.1431595224.txt.gz · Zuletzt geändert: 2015/05/14 11:20 von phi