Remote Kommandos auf Server via xinetd ausfuehren / Adminfun
Es gibt Sachen die machen Spass, z.B. diese Spielerei. Es geht darum auf einem Server ein Remotekommando / Shellskript via Webbrowser auszufuehren, ohne das dafuer irgendeine grosse Software-Remotemanagement-Loesung laufen muss. Die Antwort ist der gute alte (x)inetd verbunden mit einem kleinen PHP-Skript. Ich kommentiere das jetzt hier nicht weiter sondern schreibe es einfach mal runter:
Als erstes muessen die Programme installiert werden:
aptitude install xinetd php5-cli
Danach die folgende Datei unter /etc/xinetd.d/test ablegen
# description: xinetd + php = fun
service test
{
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/bin/php5
server_args = /root/test.php
disable = no
}Anschliessend die /etc/services editieren und die folgende Zeile einfuegen:
test 44444/tcp # test
und nun noch diese PHP-Datei unter /root/test.php ablegen:
<?php echo "+++ xinetd + php = fun +++ "; ## read parameter $handle = fopen('php://stdin','r'); $input = fgets($handle); fclose($handle); ## split get parameter $out1=str_replace("GET /", "", $input); $out2=str_replace(" HTTP/1.1", "", $out1); $parameter=explode("/", $out2); ## check if we shall do sth. and if we know it if (trim($parameter[0]) == "doStuff") { if (empty($parameter[1])) { echo "no job start requested... "; } elseif (! trim(empty($parameter[1])) AND trim($parameter[1]) == "psaux") { $out = shell_exec('ps aux'); echo "$out"; } } else { echo "no job start requested... "; } ?>
Ich denke die PHP-Datei erklaert sich von selber und kann beliebig erweitert werden. Ein Aufruf von http://example.net:44444/doStuff/psaux gibt dann die Ausgabe des Befehls "ps aux" wieder. Nun sind bei dem shell_exec keine Grenzen gesetzt...
Wichtig daran ist, dass wir die GET Parameter via stdin auslesen, da der xinetd das Zeugs ja nicht per GET an das php-Skript weiterleitet. Aber was solls... Der Kreativitaet sind da keine Grenzen gesetzt.
Ich wuerde natuerlich noch den Zugriff ueber irgendeine iptables Regel beschraenken ala:
iptables -A INPUT -p tcp -m tcp --dport 44444 -s 1.2.3.4 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 44444 -j REJECT
Und ueber Security von wegen das Skript als root laufen zu lassen usw. reden wir hier nicht weiter, es geht ja auch nicht darum das als Superloesung zu verkaufen, sondern einfach als simple kleine Adminspielerei
Neues Projekt: file delivery
Nach Goetemp und Werdertweets schmeiss ich jetzt mal file delivery hier raus ins Netz. Die Idee des Projekts ist relativ simpel. Ueber einen einfachen Weg Dateien im Internet zur Verfuegung zu stellen ohne den echten Dateinamen bekannt zu geben sowie die Dokumente im DocumentRoot vorzuhalten.
Dabei herausgekommen ist file delivery. Es ist ein in PHP geschriebenes kleines System wo ueber ein Webinterface Dateien hochgeladen werden koennen. Die Dateien koennen irgendwo im Dateisystem liegen und muessen nicht im DocumentRoot des Webservers verfuegbar sein. Nach dem Upload gibt es eine URL die aus dem Benutzernamen des Nutzers der die Datei hochgeladen und der MD5-Checksum der hochgeladenen Datei besteht. Nur mit dieser kryptischen URL kann man nun die eine Datei herunterladen.
Als kleines Addon ist eine optionale Emailbenachrichtigung implementiert, die eine Email verschickt, wenn die gewaehlte Datei heruntergeladen wird.
Das System hat eine simple Benutzerverwaltung. Neue Nutzer koennen von dem Administrator Account hinzugefuegt werden. Wenn das PHP-Modul "apc" installiert und aktiviert ist, wird auch ein Upload Fortschrittsbalken angezeigt. file delivery nutzt Smarty als Templateengine und kann dadurch komplett geskinnt werden.
Das System habe ich unter http://files.pregos.info installiert. Zugangsdaten zum Testen sind "admin/password". Fuer diese Installation habe ich das Passwort aendern fuer den Administrator deaktiviert.
Wer Anmerkungen, Kritik oder aehnliches hat, bitte immer her damit. Code gibts fuer interessierte auf Anfrage per Mail.
Howto: Mobile Webinterface
Ich schrieb ja vor kurzem darueber, dass ich eine kleine Werder Bremen Newsuebersicht erstellt habe. Als ich nun fuer ein paar Tage im Kurzurlaub war und die Seite ueber mein Handy aufrief, fiel mir auf, dass sie ein mobiles Interface gebrauchen koennte. Das Bild war zu gross, und generell haette man wohl auch was bei den Ladezeiten optimieren koennen. Wieder zurueck habe ich mich dann gleich an die Arbeit gemacht. Schnell bin ich auf zwei sehr nette Loesungen gestossen und habe kurzerhand beide miteinander Kombiniert. Die Loesungen findet Ihr auf den beiden Seiten:
Der erste Blogeintrag beschreibt, worauf man achten muss wenn man ein mobile Webseite erstellt, und beinhaltet eine Anleitung um seine eigene Seite mobil-Freundlich mit einer Subdomain zu erstellen. Der Weg ist recht simpel: Man erstellt eine Subdomain, z.B. von www.pregos.info dann mobile.pregos.info und weist der Subdomain den gleichen DocumentRoot zu. Anschliessend erstellt man zwei PHP Dateien und legt diese in den DocumentRoot. Beide PHP-Dateien werden ueber eine .htaccess vor und nach jeder HTML-Seite aufgerufen. Dabei wird ueberprueft ob die mobile.pregos.info Subdomain aufgerufen wurde, und wenn ja der HTML-Quelltext durch verschiedene Filter gejagt, die dann die Seite entsprechend anpassen.
Dieser Weg ist sehr schnell eingerichtet und funktioniert wunderbar. Ich finde ihn aber nicht schoen, denn das Szenario was mir vorschwebt ist eine mobile Seite von http://werder.pregos.info unter der gleichen Domain, da jetzt noch ne Subdomain ranzuhaengen http://m.werder.pregos.info, nee, zuviel. Ich moechte, dass die Seite je nachdem von welchem Geraet sie aufgerufen wird, entweder als mobile Version oder als normale zu sehen ist.
Ein simpler Weg dieses zu erreichen waere z.B. mittels JavaScript festzustellen wie gross die Bildschirmaufloesung des anzeigenden Browsers ist und dementsprechend die Seite mittels CSS zu layouten. Das bedeutet aber gleichzeitig, dass ich mit JavaScript arbeiten muss und alle Browser das unterstuetzen muessen und Rechenleistung auf dem mobilen Geraet und und und... Ich will EINE Domain, EINE URL und SELBSTERKENNUNG des Servers.
Ueber WURFL (Wireless Universal Ressource File) bin ich dann irgendwie zu dem Projekt Apache Mobile Filter gestossen. Apache Mobile Filter ist eine Apache-Plugin, dass die Funktionen von WURFL direkt in Apache zur Verfuegung stellt. WURFL kennt z.B. alle UserAgents (z.Zt. 8661 verschiedene) und kann auf dieser Basis sagen, ob das gerade aufrufende Geraet ein mobiles Geraet ist oder nicht. Ueberpruefen und sehen was AMF alles so an Variablen zur Verfuegung stellt koennt Ihr unter der Adresse: http://apachemobilefilter.nogoogle.it/php_test.php
Das schoene ist, dass AMF diese Variablen in PHP unter Apache als dessen Server Enviroment Variablen zur Verfuegung stellt. Ich kann also in PHP z.B. mit der Variable $_SERVER['AMF_IS_WIRELESS_DEVICE'] arbeiten. Mit dieser Loesung kann ich nun serverseitig ueberpruefen ob es sich um ein mobiles Endgeraet handelt oder nicht, und dementsprechend die mobile Version der Seite anzeigen lassen oder nicht.
Nur der Weg dahin brauchte noch etwas, der Support von Apache Mobile Filter war aber allererste Sahne, echt super, kann man nicht anders sagen, und fuer die Nachwelt hier nochmal ein Auszug aus meiner .bash_history:
mkdir foo cd foo wget http://downloads.sourceforge.net/project/mobilefilter/ApacheMobileFilter/2.21/Apache2-WURFLFilter-2.21.tar.gz?use_mirror=dfn tar -xzvf Apache2-WURFLFilter-2.21.tar.gz cd Apache2-WURFLFilter-2.21/ perl Makefile.PL make install aptitude install libapache2-mod-perl2 libgd-gd2-perl libgd-tools a2enmod perl cpan Apache2::WURFLFilter Apache2::Filter Apache2::RequestRec Apache2::RequestUtil Apache2::Connection Apache2::SubRequest Apache2::Log CGI::Cookie APR::Table CGI::Cookie LWP::Simple Image::Resize IO::Uncompress::Unzip Cache::FileBackend mkdir /var/www/MobileFilter chown www-data:www-data /var/www/MobileFilter
Dazu habe ich noch in die /etc/apache2/httpd.conf die folgenden Eintraege hineingeschrieben:
PerlSetEnv MOBILE_HOME /var/www/MobileFilter PerlSetEnv CacheDirectoryStore /tmp PerlSetEnv WurflNetDownload true PerlSetEnv DownloadWurflURL http://downloads.sourceforge.net/wurfl/wurfl-latest.zip PerlSetEnv LoadWebPatch true PerlSetEnv PatchWurflNetDownload true PerlSetEnv PatchWurflUrl http://wurfl.sourceforge.net/web_browsers_patch.xml PerlSetEnv CookieCacheSystem true PerlSetEnv CapabilityList all PerlModule Apache2::WURFLFilter PerlTransHandler +Apache2::WURFLFilter #PerlOutputFilterHandler Apache2::AMFDeviceMonitor
Anschliessend muss der Apache Webserver mit einem /etc/init.d/apache2 restart neu gestartet werden.
Welche Variablen euch dann zur Verfuegung stehen und ob alles funktioniert kann man mit der Test-PHP Seite ueberpruefen die ich oben bereits einmal verlinkt habe. Diese koennt Ihr euch ganz einfach auf euren eigenen Server schmeissen, gibts hier zum Download.
Wenn irgendwelche Fehler auftauchen oder (wie bei mir zu Anfang) die Variablen nicht zur Verfuegung stehen, einfach nochmal ein rm -rf /tmp/wurfl* machen und Apache neustarten.
Ach so... um die mobile Seite jetzt zu implementieren habe ich die bereits beschriebene Loesung mit den PHP-Files und der .htaccess genommen und einfach in der global_prepend.php und die Zeile:
if ($_SERVER['SERVER_NAME'] == 'mobile.myawesomeblog.com') {
ersetzt durch
if ($_SERVER['AMF_IS_WIRELESS_DEVICE'] == 'true') {
sowie die nachfolgende Zeile mit der URL-Ersetzung von normaler zu mobile-URL einfach weggelassen.
Werder Bremen Newsübersicht
Ich hatte die Schnauze voll von dem doofen Zusammensuchen aller Werder Bremen News am Morgen und dann ueber den Tag verteilt. Mir fehlte eine zentrale Anlaufstelle dafuer. Die Werder Bremen Presseschau ist irgendwie zu klein ![]()
Deswegen habe ich angefangen und mir kurzerhand eine kleine Seite selbergeschrieben, die div. Werder Bremen spezifische RSS-Feeds abruft und die jeweils fuenf neusten Artikel anzeigt. Weiter werden alle Artikel ebenfalls als eigener neuer RSS-Feed exportiert und dank Twitterfeed wird sogar gezwitschert.
Die Seite incl. Quelltext ist unter:
http://werder.pregos.info
zu finden. Sport1 und Fussballtransfer habe ich bereits angeschrieben da deren Feeds defekt sind, einer wird nicht aktualisiert und bei einem anderen ist die Domain der Links zu den Artikeln falsch. Beim Weser-Kurier hab ich ein komisches Problem mit Simplepie, aber das bekomme ich auch noch geloest. Bis dahin hab ich erstmal eine schoene Uebersichtsseite die ich von ueberall und den ganzen Tag lang immer aufrufen kann und immer viele Werdernews im Ueberblick habe.
