PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


PHPs Interaktive Shell

with 7 comments

Um mal eben schnell eine kurzes Snippet auszuprobieren gibt es mehrere Möglichkeiten, die wohl geläufigste ist eine neue PHP-Datei anzulegen im Document Root, sie mit seiner IDE oder zur Not auch Notepad/Textedit/vi zu öffnen und die Zeilen zu schreiben, abzuspeichern, den Browser öffnen und die URL eintippen, dann sollte man das Ergebnis sehen.

Nehmen wir an wir wollen testen was der zweite Parameter von md5() so hergibt. Der Inhalt der Datei ist also

<?
var_dump(md5('Michael Kliewe'));
var_dump(md5('Michael Kliewe', true));

Im Browser sieht man dann die Ausgabe:

string(32) "e10492e362d887c6c00c12d17ca209b5" string(16) "XXXJEDEMENGEKOMISCHEBYTESXXX" 

Einfacher ist jedoch die Verwendung der Kommandozeile. Die Datei wird nach wie vor mit dem Editor erstellt, da es nur ein Test ist legt man sie wahrscheinlich unter /tmp/ ab und ruft sie auf:

php /tmp/test01.php

Ausgabe:

string(32) "e10492e362d887c6c00c12d17ca209b5"
string(16) "XXXXXX
XXXJEDEMENGEKOMISCHEBYTESXXX"

Noch einfacher und schneller geht es mit dem “run” Parameter (-r), dann kommt man komplett ohne Datei aus:

$ php -r "var_dump(md5('Michael Kliewe'));"
string(32) "e10492e362d887c6c00c12d17ca209b5"
$ php -r "var_dump(md5('Michael Kliewe', true));"
string(16) "XXXXXX
XXXJEDEMENGEKOMISCHEBYTESXXX"

PHP bietet auch eine interaktive Shell, die man mit dem Parameter -a startet und dann PHP Code schreiben kann, inklusive Autovervollständigung für Funktionen, Konstanten, Klassennamen, Variablen, statische Methoden, Klassenkonstanten und einer History der letzten Befehle (Pfeil hoch).

php -a
Interactive shell

php > var_<TAB><TAB>
var_dump    var_export
php > var_dump(md<TAB><TAB>
md5               md5_file          mdecrypt_generic
php > var_dump(md5('Michael Kliewe'));
string(32) "e10492e362d887c6c00c12d17ca209b5"
php > var_dump(md5('Michael Kliewe', true));
string(16) "XXXXXX
XXXJEDEMENGEKOMISCHEBYTESXXX"
php > quit

Einzige Voraussetzung ist die Kompilierung von PHP mit der Readline-Extension (–with-readline). Wenn ihr fertige PHP-Pakete nutzt müßt ihr es einfach ausprobieren ob es geht, auf dem Mac im Büro beispielsweise funktioniert es mit der eingebauten PHP Version nicht. Falls es unter Debian Probleme gibt ist sie eventuell leicht nachinstallierbar:

sudo apt-get install php-readline

Unter Windows ist es auch etwas komplizierter da dort die Readline-Erweiterung nicht zur Verfügung steht. Es gibt aber einen Workaround, siehe auch die Kommentare im PHP Manual.

Für das Problem unter Mac und Windows gibt es einige Lösungen, schaut euch dazu phpa, phpa-norl, phpsh und php shell an.

Auch eine interessante Lösung für schnelle Snippet-Tests sind Mini-Webinterfaces wo man seinen PHP-Code in eine Textarea schreiben kann und mit einem Knopfdruck den Code auf dem Server ausführen kann. Bekannte Vertreter sind PHP Interactive, PHP Shell, php-web-shell, und PHPsh. Passt dabei aber auf dass ihr diese Interfaces mit einem Passwort (htaccess) oder ähnlichem schützt, denn sonst schreibt dort jemand “system(‘rm -rf /’);” rein und ihr habt ein Problem.

Welches Vorgehen habt ihr bei kleinen Snippet-Tests?

PS: Bei der Suche bin ich auf eine PHP-Reverse-Shell gestossen, keine Ahnung ob die jemand zu legalen Zwecken einsetzt, aber interessant zu sehen.

Written by Michael Kliewe

Oktober 6th, 2011 at 8:42 am

Posted in PHP

Tagged with ,

7 Responses to 'PHPs Interaktive Shell'

Subscribe to comments with RSS or TrackBack to 'PHPs Interaktive Shell'.

  1. Mein Lieblingswerkzeug ist Vim, egal ob auf Kommandozeile oder mit GUI. PHP-Schnipsel eintippen und dann das Kommando

    :w !php

    absetzen. Fertig.

    Wer die Ausgabe des PHP-Skripts weiterverarbeiten möchte, wird hier fündig: http://vim.wikia.com/wiki/Append_output_of_an_external_command

    Gabriel

    6 Okt 11 at 10:53

  2. Also ich bevorzuge ja immer noch Facebooks phpsh, einfach weil sie ein paar mehr Features bietet, z.B. mit dem Befehl d und einem Funktionsname wird die Dokumentation für die Funktion angezeigt, Output ist schön farbig, usw.
    Ich hab auch mal just for fun eine Shell für PHP gebastelt: https://github.com/domnikl/phpbash

    Dominik

    6 Okt 11 at 11:04

  3. Gibt auch dienste, wie codepad oder ideone. Da kann man das auch gleich verlinken :)

    KingCrunch

    6 Okt 11 at 11:56

  4. @KingCrunch: Ja stimmt, die beiden gibts auch noch, wenn man nicht vergisst den Code mit dem PHP Starttag zu beginnen funktioniert es sogar ;-) Aber ich weiß nicht was die an Funktionen deaktiviert haben aus Sicherheitsgründen…

    Michael Kliewe

    6 Okt 11 at 12:05

  5. Für kleinere temporäre Tests habe ich eine feste Datei deren Inhalt ich immer wieder komplett löschen kann. Da kommen allerlei Spielreien rein, nicht nur php, sondern auch css, hmtl oder javascript.
    Sollte sich ein Tests etwas weiter entwickeln, wird er in meiner eigenen Doku abgelegt. Da Dokumentiere ich meine Tests und kann sie gegebenenfalls ergänzen.
    Das ganze ist jedoch in meinen Worten für mich geschrieben. Andere würde wahrscheinlich sagen, dass es unvollständig bzw. leihenhaft ist. Beides absolut richtig, für mich reicht es jedoch.

    Ich bin auf die Idee gekommen da ich bei meiner alten Arbeit immer wieder meinem Chef Sachen beweisen musste. Hab irgendwas getestet, das Ergebnis habe ich mir dann gemerkt und den Test verworfen. Nach 6 Monaten kam das Thema wieder auf und niemand wollte mir die Ergebnisse glauben, deshalb bin ich zu dem Beamtenvorgehen übergegangen. Pflege das ganze aber recht rudimentär.

    T-Rex

    6 Okt 11 at 20:18

  6. Wir haben so etwas in unser CMF integriert – quasi eine interaktive “Produkt-Shell” via http (natürlich abgesichert). Um “mal eben” etwas innerhalb des Frameworks/der Instanz auszprobieren oder zu korrigieren ist so eine Shell bestens geeignet, manchmal reicht dafür eine textarea und eval().

    Thomas

    8 Okt 11 at 12:25

  7. […] PHPs Interaktive Shell […]

Leave a Reply

You can add images to your comment by clicking here.