WordPress Installationen und Updates mit SSH

Zugeben, ich bin kein Freund von FTP. Aktives oder Passives FTP, Daten- und Kontrollkanal, die Verschlüsselung nachträglich irgendwie an ein viertel Jahrhundert altes Protokoll ran gestrickt, eventuell noch einen TCP/IP-Filter (vulgo „Firewall“) dazwischen und schon wird das ganze zum Alptraum. Eine sinnvolle Alternative existiert schon lange: SSH! Also soll es diese Alternative auch bei meinem Blog sein.
Einsatzmöglichkeiten gibt es zu Genüge. Sei es die Aktualisierung von WordPress selber, das Ausprobieren und Installieren von Themes oder die Installation und Updates der Plugins. Voraussetzung ist aber, dass Software auf dem Server installiert werden kann.

Software

Um WordPress dazu zu bringen, SSH für die Aktualisierungen zu verwenden, wird libssh2 und die PHP Bindings für SSH benötigt. Wenn diese Bestandteil der Distribution sind, gut, ansonsten müssen sie selber compiliert werden oder Pakete bei den einschlägigen Quellen gesucht werden. Für Debian habe ich Backports der aktuellen Versionen der Pakete libssh2 und php-ssh2 erstellt, die in der aktuellen Debian Version „Lenny“ verwendete libssh2-Version muss auch ersetzt werden.

SSH-Schlüsselpaar

Benötigt wird ein SSH-Schlüsselpaar. Da der Apache-Daemon lesend auf den privaten Schlüssel zugreifen muss, sollte ein extra Schlüsselpaar für die WordPress Updates verwendet werden. Hierfür im Home-Verzeichnis (oder einem anderen, nicht auf dem Webserver publizierten Verzeichnis) „ssh-keygen“ ausführen:

ssh-keygen -C WordPress -f id_wp

Hierdurch wird der private Schlüssel „id_wp“ und der öffentlich Schlüssel „id_wp.pub“ erzeugt. Letzterer erhält zusätzlich  den Kommentar „WordPress“. Da, wie erwähnt, der Webserver auch auf den privaten Schlüssel lesend zugreifen muss, müssen die Rechte dieses Schlüssels entsprechend angepasst werden:

chgrp www-data id_wp.pub
chmod g+r id_wp.pub

In einem weiteren Schritt muss der private Schlüssel noch die Datei „authorized_keys“ eingetragen werden:

cat id_wp.pub >> ~/.ssh/authorized_keys

WordPress konfiguieren

Zum Schluss müssen noch die folgenden Zeilen der WordPress Konfiguration „wp-config.php“ zugefügt werden:

/* Updates über SSH: */
define('FTP_PUBKEY','/home/user/id_wp.pub');
define('FTP_PRIKEY','/home/user/id_wp');
define('FTP_USER','user');
define('FTP_HOST','localhost:22');

Selbstverständlich müssen Pfade und User an die lokalen Gegebenheiten angepasst werden.

Verwendete Schlagwörter: , , ,

3 Kommentare zu „WordPress Installationen und Updates mit SSH

  1. Hallo,

    das ist ein guter Tipp, den ich gerne umsetzen möchte.

    Wenn ich aber ein laufendes System habe und auch schon im ftp-Modus übertragen haben (z.B. Update der plug-ins), werden die FTP-Einträge in der wp-config.php ignoriert. 🙁

    Was fehlt mir denn noch, damit WordPress nicht mehr den Standard-FTP-Weg geht?

    Vielen Dank im voraus
    Wolfgang

    • Hallo,

      ich glaube nicht, dass das was mit der Umstellung FTP -> SSH zu tun hat, sondern eher, dass da ein Problem mit den SSH-Keys besteht. Wenn diese nicht richtig eingebunden sind, geht WP immer auf seine Defaults, also FTP, zurück.

      Ist der Public-Key in der Datei ~/.ssh/authorized_keys hinterlegt?
      Funktioniert ein manueller SSH-Login? Hierfür müssen vorübergehend die Dateizugriffsrechte für die Gruppe entzogen werden, sonst lehnt SSH auf der Komandozeile den Zugriff ab.

      Dirk

    • Hi,
      das könnte auch damit zusammenhängen, dass WordPress die Einstellungen in der Datenbank (Tabelle: wp_options) speichert.

      Log dich im Adminbereich von WordPress ein und rufe dann folgende URL auf:
      http://www.woogie.de/wp-admin/options.php (recht nützliches Backend-Script zum Listen der Einträge der wp_options Tabelle)

      Wenn du eingeloggt bist, werden dir jetzt sämtliche Einträge der Tabelle wp_options sauber gelistet.
      Darunter wirst du wahrscheinlich den Eintrag „ftp_credentials“ haben, der als Inhalt ein serialisiertes Array enthält.

      Falls ja, dann greift WordPress darauf zurück beim Updateversuch.

      Lösung:
      DELETE FROM wp_options WHERE option_name=’ftp_credentials‘;

      Damit sind die Einstellungen aus der DB gelöscht und WordPress sollte auf die Angaben aus der wp-config.php zurückgreifen und diese in die Datenbank schreiben.