Die Einsatzmöglichkeiten des Raspberry Pi, Banana Pi oder anderer Einplatinencomputer sind nahezu grenzenlos. Zur Steuerung des Raspberry Pi und Darstellung von Daten, wie beispielsweise aktuellen Sensorwerten, bietet sich ein Webinterface mit PHP an. Über die entsprechenden PHP-Befehle können Kommandos wie in der Konsole (Terminal) abgesetzt werden. Auf Grund der eingeschränkten Zugriffsrechte ist dies aber nur bedingt möglicht. Der Ausweg: Man stellt mittels PHP eine Verbindung zum SSH Server auf dem Raspberry Pi her. Im Folgenden wird gezeigt, wie man mit PHP und der PHP-Libary phpseclib eine SSH-Verbindung herstellt und anwendet.
Vorbereitung: Webserver installieren
Zunächst benötigen wir einen Webserver mit PHP. Für dieses Tutorial wird ein Apache Webserver mit PHP 5 genutzt. Wie man diesen installiert wird ausführlich im Beitrag Raspberry Pi: Webserver mit Apache 2, PHP5 und MySQL erläutert. Alternativ hier die beiden Befehle, um den Apache und PHP zu installieren:
sudo apt-get update
sudo apt-get install apache2
sudo apt-get install php5
phpseclib
Normalerweise bietet PHP die Funktionen exec() oder shell_exec() um Befehle abzusetzen. Verwendet man den Apache Webserver, dann werden die abgesetzten Befehle durch den Apache Nutzer www-data abgesetzt. Teilweise kann das funktionieren, doch die Mehrzahl der Befehle für Programmstarts oder ähnlichem schlägt fehl. Dies liegt daran, dass der Nutzer www-data nicht die entsprechenden Rechte hat um groß im System zu agieren. Theoretisch könnte man www-data die entsprechenden Rechte geben, oder gar als Sudoer eintragen, doch dies bringt öffnet eine riesen Sicherheitslücke und ist nicht sicher.
Die PHP Secure Communications Library, kurz phpseclib, verfügt über eine hunderprozentige PHP Implementierung der wichtigsten Verschlüsselungstechniken und ermöglicht an dieser Stelle einen SSH-Login via PHP. Die Bibliothe unterstützt die folgenden Verschlüsselungen / Protokolle:
- PKCS#1 (v2.1) compliant RSA
- DES, 3DES
- RC4
- Rijndael
- AES
- SSH-1, SSH-2
- SFTP
Download phpseclib
Für die SSH-Verbindung via PHP sind nur die SSH-Techniken, konkret SSH-2, relevant. Unter http://phpseclib.sourceforge.net/ kann phpseclib heruntergeladen werden. Außerdem informiert die Webseite mit Hilfe von beispielhaften Ansätzen wie die Bibliothek zu handhaben ist. Im Bereich SSH-2 wird daher der entsprechende Ansatz für eine SSH-Verbindung mit Login (Passwort) gezeigt.
Das heruntergeladene Archiv von phpseclib enthält 5 Ordner. Ich empfehle einen neuen Ordner phpseclib zu erstellen und dort herein das Archiv zu entpacken.
Jetzt können wir phpseclib in unserem Projekt verwenden. Dazu erstellen wir im gleichen Verzeichnis wo der neue Ordner phpseclib ist eine PHP-Datei. Im folgenden Codeausschnitt loggen wir uns mit dem Standard-Benutzer pi (Passwort: raspberry) auf dem Einplatinencomputer ein und fragen den Hostnamen ab.
<?php include('phpseclib/Net/SSH2.php'); $ssh = new Net_SSH2('localhost'); if (!$ssh->login('pi', 'raspberry')) { exit('Login Failed'); } echo $ssh->exec('hostname -f'); ?>
Der Quellcode kurz erklärt:
Mit der Include-Funktion laden wir die Datei SSH2.php aus dem Unterordner Net. Diese stellt alle Funktionen bereit, die für die SSH-Verbindung via PHP notwendig sind – kurz gesagt, die Bibliothek nimmt uns sehr viel arbeit ab.
Nach dem Include laden wir die Klasse Net_SSH2 und übergeben die Adresse des SSH-Servers. In diesem Fall soll der PHP-Code auf dem Webserver auf dem Pi liegen, sodass wir mit localhost arbeiten können. Alternativ ist die Angabe der IP-Adresse oder einer Domain möglich.
$ssh = new Net_SSH2('localhost');
Anschließend melden wir uns mit der Login-Funktion der Klasse am SSH-Server an. Dabei übergeben wir hier die Standard-Logindaten / Benutzerkennung des Users pi mit dem Passwort raspberry. Die Benutzerdaten müssen je nach Abweichungen entsprechend angepasst werden. Für konkrete Anwendungen ist es empfehlenswert, alleine schon aus Sicherheitsgründen, eine Loginform zu erstellen und die Benutzerdaten mit Variablen zu übergeben.
Abschließend kann die exec-Funktion der Klasse aufgerufen und ein oder mehrere SSH-Befehle abgesetzt werden. Wichtig ist dabei, dass der Benutzer mit dem man sich via SSH eingeloggt hat, die nötigen Berechtigungen hat. In diesem Beipiel lassen wir uns einfach mal den Hostname anzeigen.
echo $ssh->exec('hostname -f');
Quellen: phpseclib.sourceforge.net, Opitz Online
Funkioniert bei mir irgendwie nicht
Hallo Manuel,
an welcher Stelle scheitert es genau? Tritt irgend eine Fehlermeldung auf? Eventuell sind die Verzeichnisbeziehungen nicht richtig.