PHPs Interaktive Shell
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.
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
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
Gibt auch dienste, wie codepad oder ideone. Da kann man das auch gleich verlinken 🙂
KingCrunch
6 Okt 11 at 11:56
@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
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
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
[…] PHPs Interaktive Shell […]
History und Autocompletion in Konsolentools mit readline | the web hates me
17 Feb 14 at 06:58