MoonlightShadow753 Geschrieben 11. November 2008 Geschrieben 11. November 2008 Hallo liebe Fachinformatiker-Gemeinde, ich habe mir die zahlreichen Artikel zu diesem Thema durchgelesen und bin nun seit fast einer Woche bei ein und dem selben Problem: Ich muss per PHP eine SH-Datei ausführen lassen. Einige Erfolge hatte ich bereits bei Nutzung des folgenden Codes: <?php $text = $_GET['text']; $uin = $_GET['uin']; $le = system("./icq.sh ".$text." ".$uin,$antwort); echo "Letzte Zeile: $le<p>"; echo "Antwort: $antwort<p>"; ?>[/PHP] Die Datei "icq.sh" enthält folgenden Code: [code]echo "Bitte warten, starte Versendevorgang von Text \"$1\" an \"$2\"" echo " " echo "$1" | centericq -s msg -p icq -t $2 exit 0[/code] Also soll die SH-Datei per CenterICQ eine Nachricht an den User übermitteln, den das PHP-Script per Variable übergibt (genau wie den Text!). Das Script wird beim Aufruf korrekt gestartet, allerdings wird scheinbar nur der erste und der zweite "Echo"-Befehl ausgeführt, ich sehe folgendes im Firefox: Bitte warten, starte Versendevorgang von Text "text" an "123456789" Letzte Zeile: Antwort: 0 Diese erste Zeile Bitte warten, starte Versendevorgang von Text "text" an "123456789" wird zweifelsfrei vom Script ausgegeben, die "Letzte Zeile:" wird wiederum von PHP eingefügt und würde normalerweise einen Code enthalten, aber da das Script bei [CODE]echo " "[/code] zu stoppen scheint, ist die Ausgabe auch = " ". Nun Frage ich mich natürlich, warum die eigendliche Aktion, der Versand, nicht durchgeführt wird! Kann das eventuell an Dateirechten etc. liegen? Ich betreibe das alles auf einem Ubuntu (Hardy) mit Apache2... Kann mir da irgendjemand helfen? Die ganzen Möglichkeiten mit der SSH2-Bibliothek habe ich bereits ausprobiert, aber wenn ich diese in Apache integrieren will, kommen immer Fehler, die mir nichts sagen - Bitte helft mir LG, Moonlight Zitieren
Chefe Geschrieben 12. November 2008 Geschrieben 12. November 2008 Skript liegt im selben Verzeichnis wie der PHP Code? Skript kann von wwwrun ausgeführt werden (bzw. vom Nutzer der den httpd Dienst ausführt)? Skript funktioniert wenn Du es ohne PHP ausführst? Zitieren
MoonlightShadow753 Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 3 Frage, eine Antwort: JA! Zitieren
MoonlightShadow753 Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 Scheinbar gibts hier keine Editierfunktion, also muss ich wohl ein Doppelpost machen. Das Script wird ja bis zum echo " " ausgeführt, nur der Rest irgendwie nicht. Gibt es eine Möglichkeit, mir eventuell Fehlermeldungen, die das Script zurückgeben könnte, anzeigen zu lassen? LG Zitieren
Chefe Geschrieben 12. November 2008 Geschrieben 12. November 2008 Anscheinend hängts mit der Pipe zusammen. Kann centericq nachrichten auch aus testfiles versenden? Zitieren
MoonlightShadow753 Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 Anscheinend hängts mit der Pipe zusammen. Kann centericq nachrichten auch aus testfiles versenden? testfiles ?? Wenn ich in der Konsole direkt eingebe: cd /var/www ./icq.sh hallo 123456789 Dann funktioniert es ja! Das ist das komische! Als Antwort kommt dann "Die Nachricht an 123456789 wurde erfolgreich in die Warteschleife aufgenommen" oder so ähnlich - Und kurz danach wird die Nachricht verschickt. Ist ja genau das selbe, wie, wenn ich folgendes eingebe: echo "hallo" | centericq -s msg -p icq -t 123456789 ... ich verstehe das garnicht mehr ... :confused::confused: Zitieren
Carnie Geschrieben 12. November 2008 Geschrieben 12. November 2008 Du übergibst beim Aufruf keine Argumente mehr. Der System Aufruf endet bei den nächsten ". Versuchs mal mit $le = system('"./icq.sh ".$text." ".$uin',$antwort); Zitieren
MoonlightShadow753 Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 Du übergibst beim Aufruf keine Argumente mehr. Der System Aufruf endet bei den nächsten ". Versuchs mal mit $le = system('"./icq.sh ".$text." ".$uin',$antwort); Hallo mit $le = system('"./icq.sh ".$text." ".$uin',$antwort); geht's schonmal garnicht, wegen den doppelten ' und " . Bei Verwendung von: $le = system('./icq.sh '.$text.' '.$uin,$antwort); kommt folgende Antwort: Bitte warten, starte Versendevorgang von Text "tesphp" an "193821234" Letzte Zeile: Antwort: 0 Ich verstehe das irgendwie nicht mehr wirklich aber danke für die antwort! Zitieren
Carnie Geschrieben 12. November 2008 Geschrieben 12. November 2008 Dann verzichte mal komplett drauf. $le = system("./icq.sh $text $uin",$antwort); Zitieren
MoonlightShadow753 Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 Habe jetzt die chown auf "www-run" und chmod auf "755" gesetzt. Ergebnis: Bitte warten, starte Versendevorgang von Text "tesphp" an "193821234" Letzte Zeile: Antwort: 0 Zitieren
MoonlightShadow753 Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 Dann verzichte mal komplett drauf. $le = system("./icq.sh $text $uin",$antwort); gesagt - getan: Selbes Ergebnis -.- Zitieren
DevilDawn Geschrieben 12. November 2008 Geschrieben 12. November 2008 Wieso bist du so sicher das dein Script nach dem 2. echo stoppt? Dafür gäbe es keinen Grund. Hast du Debug-Zeilen eingefügt? Exitcode Abgefragt? Ist für das Script wenn es als wwwrun ausgeführt wird centericq überhaupt im Pfad? Läuft der Webserver eventuell chrooted? Oder mit mod_security o.ä.? Spricht das errorlog zu dir? #!/bin/sh # html <p> for ease of use P='<p>' echo "Bitte warten, starte Versendevorgang von Text \"$1\" an \"$2\" $P" echo "Debug: Mein Pfad: $PATH $P" echo "$1" | centericq -s msg -p icq -t $2 || echo "Fehler beim Aufruf $P" echo "Debug: Aufruf beendet, exit code $? $P" Wo nimmt centericq seine eigenen Kontodaten her? Aus einem .rcfile im $HOME? Existiert das für den effektiven Benutzer wwwrun? Fragen über Fragen. Zitieren
MoonlightShadow753 Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 Also, CenterICQ läuft im Hintergrund und ist online - Daher hat es seine Zugangsdaten. Ich glaube nicht, dass der Server chrootet läuft (Sofern ich den Begriff richtig verstanden habe). Hier ist die Ausgabe deines Codes: Bitte warten, starte Versendevorgang von Text "test" an "193821234" Debug: Mein Pfad: /usr/local/bin:/usr/bin:/bin Fehler beim Aufruf Debug: Aufruf beendet, exit code 0 Letzte Zeile: Debug: Aufruf beendet, exit code 0 Antwort: 0 Scheinbar stoppt er doch nicht beim "echo " "", sondern kann nur den Aufruf nicht durchführen ?! LG Zitieren
DevilDawn Geschrieben 12. November 2008 Geschrieben 12. November 2008 Scheinbar stoppt er doch nicht beim "echo " "", sondern kann nur den Aufruf nicht durchführen ?! Wie gesagt, die Annahme das Script würde nach echo Abbrechen war ja nun wirklich aus der Luft gegriffen. Leider unterdrückt das echo "Fehler beim Aufruf" die exitcode-Ausgabe. Wobei dir der Exitcode nur was nützt wenn du weißt was sie Bedeuten. echo "$1" | centericq -s msg -p icq -t $2 2>&1 || echo "$P Fehler beim Aufruf, Fehlercode $? $P" system() liest imho nur STDOUT aus, also keine Fehlermeldungen. Das 2>&1 könnte dir einen hinweis geben. Zitieren
Chefe Geschrieben 12. November 2008 Geschrieben 12. November 2008 Hast Du ssh Zugriff auf dem Webserver? Dann einloggen, mittels: ps ax | grep httpd/apache rausfinden unter welchen Namen der Webserver läuft. sudo $nutzername$ -l Nun mit dem Benutzer probieren ob das Skript geht. In Erfahrung bringen, wie der Webserver läuft (sprich chroot/mod_security). Zitieren
DevilDawn Geschrieben 12. November 2008 Geschrieben 12. November 2008 rausfinden unter welchen Namen der Webserver läuft. sudo $nutzername$ -l Nun mit dem Benutzer probieren ob das Skript geht. Der webserver-user sollte keine reguläre shell haben, su(do) wird eher nicht gehen. Zitieren
MoonlightShadow753 Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 Hast Du ssh Zugriff auf dem Webserver? Dann einloggen, mittels: ps ax | grep httpd/apache rausfinden unter welchen Namen der Webserver läuft. sudo $nutzername$ -l Nun mit dem Benutzer probieren ob das Skript geht. In Erfahrung bringen, wie der Webserver läuft (sprich chroot/mod_security). Ich habe jeden Zugriff - Der Server läuft virtuell unter Windows XP Die Ausgabe deines Befehls ergibt (unter root): 5289 pts/3 S+ 0:00 grep httpd/apache Die Verwendung von echo "$1" | centericq -s msg -p icq -t $2 2>&1 || echo "$P Fehler beim Aufruf, Fehlercode $? $P" bringt folgendes Ergebnis: Bitte warten, starte Versendevorgang von Text "testperphp" an "193821234" Debug: Mein Pfad: /usr/local/bin:/usr/bin:/bin terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct NULL not valid Fehler beim Aufruf, Fehlercode 134 Letzte Zeile: Fehler beim Aufruf, Fehlercode 134 Antwort: 127 Aber ganz ehrlich, ich kenne mich nicht sooooo sehr mit Linux aus - Und dieser Fehler sagt mir nicht wirklich was -.- Zitieren
Chefe Geschrieben 12. November 2008 Geschrieben 12. November 2008 (bearbeitet) Stimmt, aber normal wenn die Option -l weg ist sollte es gehen (habs gerade probiert auf nem lokalen Webserver). --- Lass nochmal das alte Skript laufen (ohne die Debug Änderungen). Momentan solls ja noch an PHP weiterleiten. Bearbeitet 12. November 2008 von Chefe Zitieren
MoonlightShadow753 Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 (bearbeitet) Sorry, war vielleicht falsch ausgedrückt, das genannte ist das Ergebnis des Befehls ps ax | grep httpd/apache und da gibts kein -l ? Aber es wird ja auch der folgende Fehler beim "neuen" Script angezeigt: terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct NULL not valid Fehler beim Aufruf, Fehlercode 134 ----------------------- Das alte Script sagt: Bitte warten, starte Versendevorgang von Text "test" an "193821234" Letzte Zeile: Antwort: 0 Bearbeitet 12. November 2008 von MoonlightShadow753 Altes Script & Fehlercode neues Script Zitieren
DevilDawn Geschrieben 12. November 2008 Geschrieben 12. November 2008 Aber ganz ehrlich, ich kenne mich nicht sooooo sehr mit Linux aus - Und dieser Fehler sagt mir nicht wirklich was -.- Scheint ein C++ Fehler zu sein der auf einen Nullpointer hinweist. Das ist die direkte Fehlermeldung von centericq, hat also nicht direkt was mit Linux zu tun. Es scheint mir nun so als wenn centericq dein $1 nicht bekommt bzw. damit nicht umgehen kann. Prüf mal ob derselbe Fehler auf der shell auftritt wenn du ein echo "" | centericq ... machst. Sind im Text eventuell unsichtbare Zeichen wie Newline etc. drin, die auch bei der HTML Ausgabe ignoriert werden? An dieser Stelle haben wir herausgefunden dass das Script sehr wohl aufgerufen wird, aber die Eingabe wohl nicht mag. Jetzt bist du wieder gefragt. Ideen: Script-Ausgabe mit <pre> umschließen um Newlines zu erkennen "echo $1 > Datei" und Datei mit od oder hexeditor genau ansehen Zitieren
MoonlightShadow753 Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 Also, hab's abgearbeitet: echo "" | centericq ... Dazu sagt CenterICQ garnichts, nur brav "Nachricht wurde der Warteschleife hinzugefügt" (oder ähnlich). Habe die SH-Datei mit folgendem Inhalt jetzt stehen: echo $1 > test Dabei wird keine Datei angelegt ... Eventuell ein Rechte-Problem? *EDIT* Nach Änderung der Zugriffsrechte für /var/www geht das mit der Datei, der Eintrag ist einwandfrei meine Variable. Ich habe den Test mit "<pre>" vor und "</pre>" hinter den Einträgen in der PHP-Datei gemacht. Kann das Ergebnis nicht so recht in Worte formulieren, deshalb hab ich's hier mal grafisch: Ohne "<pre>": Mit "<pre>": ... Ich verzweifle -.- Ich glaub, ich kann in Linux (Ubuntu) garnichts Zitieren
Chefe Geschrieben 12. November 2008 Geschrieben 12. November 2008 Im Internet habe ich gelesen das centericq die Pipe nicht verarbeiten kann. Daher die Frage ob CICQ auch aus Textfiles lesen kann. Somit hättest wenigstens nen Workaround. Zitieren
MoonlightShadow753 Geschrieben 12. November 2008 Autor Geschrieben 12. November 2008 Im Internet habe ich gelesen das centericq die Pipe nicht verarbeiten kann. Daher die Frage ob CICQ auch aus Textfiles lesen kann. Somit hättest wenigstens nen Workaround. Hallo das sagt mir jetzt nichts Ich hätte auch keine Idee, wie ich cicq die textdatei übergeben soll... wäre ja auch unmöglich, wenn mehrere icq-nachrichten parallel verschickt werden würden -.- (ok, außer man legt tausende textfiles an ^^) ... Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.