Benutzer-Werkzeuge

Webseiten-Werkzeuge


dev:shelltricks

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:

$ export IMAPSYNC_PASSWORD1=oldPassword1234
$ export IMAPSYNC_PASSWORD2=newPasswordXYZ
$ imapsync --host1 imap.example.com --authmech1 PLAIN --user1 old_user \ 
           --host2 imap.onlime.ch   --authmech2 PLAIN --user2 new@example.com \
           --delete2 --delete2folders
imapsync erkennt automatisch, ob die IMAP-Server jeweils SSL/TLS unterstützen und wählt in diesem Fall eine verschlüsselte Verbindung via Port 993.
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.
$ export IMAPSYNC_PASSWORD1=oldPassword1234
$ export IMAPSYNC_PASSWORD2=newPasswordXYZ
$ imapsync --host1 imap.example.com --authmech1 PLAIN --user1 old_user \ 
           --host2 imap.onlime.ch   --authmech2 PLAIN --user2 new@example.com

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
#######################################
 
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 >> imapsync_err.log
    echo $MESSAGE >> imapsync_results.log
 
    # security: use environment variables for passwords in order 
    # not to pass them directly by command line option
    export IMAPSYNC_PASSWORD1="$SRCPW"
    export IMAPSYNC_PASSWORD2="$DSTPW"
 
    ## VARIANT 1) source host supports SSL/TLS (imap port 993)
    imapsync --host1 $SRCHOST --authmech1 PLAIN --user1 $SRCUSER \
             --host2 $DSTHOST --authmech2 PLAIN --user2 $DSTUSER 2> imapsync_err.log > imapsync_results.log
 
    ## VARIANT 2) source host has different INBOX prefix, transform it while syncing
    #imapsync --host1 $SRCHOST --authmech1 PLAIN --user1 $SRCUSER \
    #         --host2 $DSTHOST --authmech2 PLAIN --user2 $DSTUSER \
    #         --regextrans2 "s/INBOX.INBOX/INBOX/" 2> imapsync_err.log > imapsync_results.log
done
 
MESSAGE="[`date +"$TSFORMAT"`] imapsync sucessfully completed!"
echo $MESSAGE
echo $MESSAGE >> imapsync_results.log
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 --version
WP-CLI 1.5.1

Wordpress Installieren

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

$ cd ~/webhome/public_html/www/
$ rm -f default-index.php
 
# download latest version of wordpress
$ wp core download

Sie können beim Download von Wordpress auch gleich einen anderen Pfad und/oder eine andere Sprachvariante angeben:

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

Anstatt sich durch den Setup-Assistenten von Wordpress zu quälen, können Sie dafür auch WP-CLI verwenden (ACHTUNG: Die Datenbank muss zuvor via unser Controlpanel eingerichtet werden, auch empfehlen wir, vorgängig das SSL-Zertifikat aufzuschalten via unser Controlpanel, sofern Sie die Site über HTTPS laufen lassen wollen:

$ wp core config --dbname=web123_wp --dbuser=web123_wp --dbpass=************
$ wp core install --url='https://www.example.com' --title='Test Site' --admin_user='USER' --admin_email='EMAIL'

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'

Bei einer Umstellung auf SSL machen Sie am besten ein Search-replace auf eine genügend spezifische URL, z.B.:

$ wp search-replace 'http://www.example.com' 'https://www.example.com'
dev/shelltricks.txt · Zuletzt geändert: 2018/05/14 08:36 von phi