blog.bartlweb - a technologist's external brain

Thema: PHP

Befehle auf Remote-Systemen mittels SSH-Verbindung über PHP absetzen

"Ein Verwaltungsinterface auf einem Gatewayrechner für interne Systeme", "das Deployen von generierten Konfigurationsdateien", "den Status eines Drittsystems erfassen", ... es gibt unzählige Anwendungsfälle, in denen es notwendig werden kann sich per PHP-Skript und SSH auf ein entferntes System zu verbinden und dort Befehle abzusetzen.

Die Library phpseclib (phpseclib.sourceforge.net) ermöglicht es, aus PHP-Skripten heraus, SSH-Verbindungen aufzubauen und Befehle abzusetzen.

Authentifizierung mit Benutzername und Passwort

Die einfachere Variante ist die Authentifizierung mit Benutzername und Passwort am entfernten System. Hierfür reicht bereits das Einbinden der Library und wenige Zeilen Code aus.

PHP unter Windows kann die Erweiterung cURL nicht laden

Im Regelfall lassen sich sowohl unter Windows als auch Linux PHP-Module durch einfaches Auskommentieren der zugehörigen Zeile in der Konfigurationsdatei php.ini aktivieren. So aktiviert die Zeile extension=php_curl.dll das Modul cURL.

Unter Windows wird in den Logdateien, dann allerdings der folgende Fehler angezeigt:

PHP Warning:  PHP Startup: Unable to load dynamic library 'C:/Program Files (x86)/PHP/ext/php_curl.dll' - Das angegebene Modul wurde nicht gefunden.\r\n in Unknown on line 0

Diese Warnung entsteht, weil PHP die notwendigen Abhängigkeiten nicht finden kann. Um dies zu lösen, müssen Sie die Datei libssh2.dll aus dem PHP-Installationsverzeichnis nach <Installationspfad>\Apache24\bin\ kopieren und eine Pfadvariable auf den PHP-Ordner in der Windows-Systemkonfiguration ergänzen.

Apache mittels PHP reloaden

Die folgende Lösung ist definitiv eine Bastellösung und daher nur für interne und gut abgesicherte PHP-Anwendung gedacht. Die folgende Anleitung ermöglicht es den Apache Webserver mit Hilfe eines PHP-Skriptes neu zu laden. Erforderlich ist dies wenn die Apache-Konfiguration mittels PHP geändert werden kann (z.B. hinzufügen eines neuen virtuellen Hosts). Zu beachten ist das nach ausführen des Skripts 2-5 Sekunden vergehen können bevor der Server wirklich "reloaded" wurde.

Da unsere PHP-Umgebung mit den eingeschränkten Rechten des Webserver-Benutzers läuft und der Apache-Server nur mit Hilfe von Root-Rechten "reloaded" werden kann bedient man sich der Hilfe von visudo um dem Benutzer das Ausführen des Befehls mit sudo ohne Eingabe des Passworts zu ermöglichen.

Die PHP-Funktion file_get_contents() hinter einem Proxy-Server nutzen

Gerade bei größeren Unternehmen kommt es des öfteren vor, dass auch die Webserver hinter einem Proxy stehen und nur über diesen Zugriff auf das Internet oder speziell freigegebene Urls erhallten. Um dennoch die PHP-Funktion file_get_contents() für das holen von Textdateien von einem entfernten Server zu nutzen, muss man dieser den Proxy-Server mitteilen.

$context = stream_context_create(array(
    'http' => array(
        'proxy' => "tcp://192.168.0.254:8080",
        'request_fulluri' => True,
    )
));
$fileContent = file_get_contents('http://www.domain.com/file.txt', false, $context);

Leerzeilen aus Strings entfernen

Die folgenden Regular-Expression entfernt unter PHP Leerzeilen aus Strings.

$content = preg_replace("/[\r\n]+[\s\t]*[\r\n]+/","\n", $content);

Hinweis: Ersetzt man den Parameter für die Ersetzung durch einen leeren String, so werden alle Zeilenumbrüche im String entfernt.

PHP-Funktion für das Erstellen von Passwörtern

Die folgende PHP-Funktion ermöglicht das Erstellen von zufällig generierten sicheren Passwörtern. Dabei kann die Länge und die zu verwendenden Zeichen definiert werden. Weiters wird sichergestellt, dass jedes Zeichen nur einmal im Passwort verwendet wird.

function randomPassword($length = 8) {
    /* config */ 
    $maxLength = 32;
    $possible = '012346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ.,_-#"+*?!&()[]{}%$<>';
 
    /* generate password */
    $maxlength = strlen($possible);
    if ($length > $maxlength) {
        $length = $maxlength;
    }
 
    $password = "";
 
    $i = 0;
    while ($i < $length) {
        $char = substr($possible, mt_rand(0, $maxlength-1), 1);
        if (!strstr($password, $char)) {
            $password .= $char;
            $i++;
        }
    }
 
    return $password;
}

Datei-Download mittels PHP erzwingen

Das folgende PHP-Skript zwingt den Browser dazu den Download-Dialog auch für unterstützte Dateiformate anzuzeigen und ist somit eine Möglichkeit den Download von Dateien zu erzwingen. Des weiteren bietet es die Möglichkeit den ursprünglichen Speicherort von Dateien zu verschleiern.

GET-Parameter

  • action -> ruft die Funktion auf, sobal der Wert download zugewiesen wird
  • file -> der Dateiname ohne Pfad
  • secure -> MD5-Wert aus der Kombination Dateiname und Salt
  • name (optional) -> alternativer Dateiname für den Download, wird dieser nicht angegeben wird der Dateinamen der Originaldatei verwendet

Funktion

$basepath = '/wwwroot/downloads/';
$downloadSecureSalt = '7JHI63%$"§§2hgHJKBi2g342&%$§dfh3g2jfk4gHGTR%DCvvdbszifgVKJGCFD';

PHP-Funktion für die formatierte Ausgabe von Datei-Größen

Die folgende PHP-Funktion rundet eine in Byte angegebene Dateigröße auf 2 Nachkommastellen und fügt eine sinnvolle Dateigrößen-Einheit (Bytes, KB, MB, etc.) hinzu.

function formatFilesize($size) {
    $filesizename = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
    if($size) {
       if(floor(log($size, 1024)) < 2) {
          $size = round($size/pow(1024, ($i = floor(log($size, 1024)))), 0) . $filesizename[$i];
       } else {
          $size = round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $filesizename[$i];
       }
    } else {
        $size = "0 Bytes";
    }
    
    return $size;
}

Google Geocode Service in PHP nutzen

Google bietet die Möglichkeit Positionsdaten von Adresse, Städten, Straßen mittels Geocoding zu ermitteln. Dies kann Clientseitig mittels JS passieren oder aber auch Serverseitig durch den Aufruf einer URL. Dabei liefert Google ein XML-Dokument zurück, dass mittels PHP leicht geparst werden kann.

URL-Syntax

http://maps.google.com/maps/geo?q=[]&output=[]&key=[]

  • q
    Suchanfrage
    mehrere Worte mit + verbinden
  • output
    Typ der Ausgabe: xml oder html
    Standard ist xml
  • key
    ein gültiger Google-API-Key

http://maps.google.com/maps/geo?q=1200+wien&output=xml&key=ABQIAAAAs-81XuoxqzyG-Ie2CT72UhTfU3gdmQ-RPKoFZ_gIMx2_IU9bDxSUIz5Wk18sfrWsnp26WYx3VDsLSg

PHP-Code

function getCoordinates($address,$api_key) {
  $result = false;
  $url = 'http://maps.google.com/maps/geo';
  $url .= '&q=' . rawurlencode($address);
  $url .= '&key=' . $api_key;
  $url .= '?output=xml';
  $coords = array();

PHP Shorttags aktivieren

Standardmäßig führt PHP nur Code zwischen den Tags <?php ... ?> aus. Es gibt jedoch auch die Möglichkeit diese Tags in der Kurzform <? ... ?> , den Shorttags, zu schreiben. Generell sollten Shorttags jedoch vermieden werden.

Um Shorttags dennoch zu aktivieren editiern Sie die PHP-Konfiguriationsdatei "php.ini" und starten den Webserver neu.

short_open_tag = On