Zum Inhalt springen

SH/SSH-Befehle per PHP auf Ubuntu ausführen


MoonlightShadow753

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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).

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 -.-

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Chefe
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von MoonlightShadow753
Altes Script & Fehlercode neues Script
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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>":

b3ryrzokym9fyv7x0.png

Mit "<pre>":

b3rys3d45p179w250.png

... Ich verzweifle -.- Ich glaub, ich kann in Linux (Ubuntu) garnichts :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

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 ^^)

...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...