php exec - befehl an shell übergeben

Apache, Lighttpd, nginx, Cherokee
schwannek
Posts: 49
Joined: 2007-03-15 20:05

php exec - befehl an shell übergeben

Post by schwannek » 2007-08-22 16:16

und zwar möchte ich befehle direkt an die shell übergeben,

Nach langem probieren hat es immer noch nicht geklappt obwohls ja eigentlich nicht so schwer ist desshalb habe ich mal gegooglt und ein "testscript" gefunden, um zu testen ob es vllt an meinen server einstellungen liegt.

Testscript:

Code: Select all

<?php

$Meldung = exec("ping -n 1 web.de", $RueckgabeProgramm, $RueckgabeStatus);

echo$Meldung,
    "<br><br>";

if($RueckgabeStatus == 0)
{
    echo"<font color="green">Ping erfolgreich</font>";
}
else
{
    echo"<font color="red">Ping nicht erfolgreich</font>";
}

?>


Beispiel:
http://www.webmaster-resource.de/tricks ... hren-1.php

so sollte die Ausgabe aussehen wenn alles glatt läuft, bei mir zeigt er allerdings lediglich die else Schleife an.

"Ping nicht erfolgreich"

Womit kann das nun zusammen hängen.

PS: andere Befehle funktionieren auch nicht.

bernsteinkater
Posts: 67
Joined: 2006-06-27 11:47

Re: php exec - befehl an shell übergeben

Post by bernsteinkater » 2007-08-22 17:28

schwannek wrote:ping -n 1 web.de

Versuch mal:

Code: Select all

ping -c 1 web.de

User avatar
Joe User
Project Manager
Project Manager
Posts: 11139
Joined: 2003-02-27 01:00
Location: Hamburg

Re: php exec - befehl an shell übergeben

Post by Joe User » 2007-08-22 17:31

Code: Select all

grep disable /path/to/php.ini

schwannek
Posts: 49
Joined: 2007-03-15 20:05

Re: php exec - befehl an shell übergeben

Post by schwannek » 2007-08-22 21:20

ping -n 1 web.de

hat nichts gebracht...


in die php datei einfügen nehme ich mal an....

grep disable /path/to/php.ini

dann zeigt er mir garnichts mehr an nur noch weisse seite...


noch andere ideen womit es zusammen hängen könnte?

rootsvr
Posts: 538
Joined: 2005-09-02 11:12

Re: php exec - befehl an shell übergeben

Post by rootsvr » 2007-08-22 21:48

Nein Du sollst gucken ob in deiner php.ini exec in den disable_functions oder alternativen (suohosin) vorkommt.

ALternativ hilft auch ein blick in die logfiles.

generell ist es gut mittels su der entsprechende User zu werden bevor man die programme (auf der cli) testet

bernsteinkater
Posts: 67
Joined: 2006-06-27 11:47

Re: php exec - befehl an shell übergeben

Post by bernsteinkater » 2007-08-23 12:59

schwannek wrote:ping -n 1 web.de

hat nichts gebracht...

Daher schrieb ich ja auch "ping -c 1 web.de"

schwannek
Posts: 49
Joined: 2007-03-15 20:05

Re: php exec - befehl an shell übergeben

Post by schwannek » 2007-08-23 20:45

disable_functions no value no value

sry war schreibfehler habe

ping -c 1 web.de

getestet aber kam auch nichts bei raus.

über suohosin musste ich mich erstmal bei google schlau machen :)

habe bei mir aber nichts gefunden

ps: in welchen logfiles sollte es zu finden sein

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: php exec - befehl an shell übergeben

Post by daemotron » 2007-08-23 20:55

schwannek wrote:

Code: Select all

<?php

$Meldung = exec("ping -n 1 web.de", $RueckgabeProgramm, $RueckgabeStatus);

echo$Meldung,
    "<br><br>";
[...]
?>


Da fehlt ein Leerzeichen zwischen "echo" und "$Meldung".

schwannek
Posts: 49
Joined: 2007-03-15 20:05

Re: php exec - befehl an shell übergeben

Post by schwannek » 2007-08-23 21:08

danke für den tipp

Da fehlt ein Leerzeichen zwischen "echo" und "$Meldung".

war aber nicht die ursache ;)

Ping nicht erfolgreich

User avatar
Joe User
Project Manager
Project Manager
Posts: 11139
Joined: 2003-02-27 01:00
Location: Hamburg

Re: php exec - befehl an shell übergeben

Post by Joe User » 2007-08-23 21:10

Darf der User überhaupt pingen? Mal mit vollständigem Pfad versucht? exec-Alternativen versucht?

schwannek
Posts: 49
Joined: 2007-03-15 20:05

Re: php exec - befehl an shell übergeben

Post by schwannek » 2007-08-23 21:48

das weiss ich ja eben nicht.

normalerweise führt das ja der benutzer apache aus richtig?

hab aber auch schon andere befehle versucht einfach mal pwd oder ls oder sonst was und testweise den ordner mal auf 777 gesetzt dann müsste das doch eigentlich auch klappen, tuts aber net.
zum richten path.
klappt doch auch wenn ich irgendwo

ping -c 1 web.de

eingebe, auf was für nen path soll ich denn da beziehn ?

kann ich vllt beeinflussen das er den befehl nicht als user apache ausführt sonder als benutzerX ?


habs auch schonmit

passthru

versucht.

auf welches logfile muss ich mich denn beziehen ? irgend eins vom apache?

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: php exec - befehl an shell übergeben

Post by daemotron » 2007-08-23 22:15

Ausführbare Dateien wie ping etc. liegen i.d.R. unter /usr/bin, /bin, /usr/sbin, /sbin, /usr/local/bin oder /usr/local/sbin. Wenn Du über die Shell arbeitest, wird beim starten der Shell normalerweise ein Skript ausgeführt (z. B. ~/.bashrc oder /etc/profile), mit den u. a. die Umgebungsvariable PATH gesetzt wird. Diese enhält dann eine Liste der Pfade, die von der Shell nach den Programmen durchsucht werden, wenn Du sie ausführen möchtest. Deshalb musst Du nicht /usr/bin/ping eingeben, sondern ein einfaches "ping" genügt.

Der Webserver wird aber i.d.R. als Daemon-Prozess gestartet und läuft damit direkt als Kindprozess von init und nicht als Kindprozess einer Shell. Damit kann er auch nicht auf $PATH zurückgreifen, um Programme zu finden. Du musst also in PHP-Skripten absolute Pfade zu Programmen verwenden, die Du ausführen möchtest. Um zu ermitteln, wo Dein ping-Programm liegt, kannst Du folgenden Shell-Befehl verwenden:

Code: Select all

whereis ping


Kleiner Hinweis am Rande: Das ist Linux/*NIX Grundlagenwissen. Wenn Du einen Server administrieren willst, solltest Du es schleunigst nachholen, Dir das anzueignen...

User avatar
Joe User
Project Manager
Project Manager
Posts: 11139
Joined: 2003-02-27 01:00
Location: Hamburg

Re: php exec - befehl an shell übergeben

Post by Joe User » 2007-08-23 22:24

Was steht in der ls.txt?

Code: Select all

system("/bin/ls -alh / > ./ls.txt");


Logfiles:

Code: Select all

grep -i errorlog /path/to/httpd.conf
grep -i error_log /path/to/php.ini

schwannek
Posts: 49
Joined: 2007-03-15 20:05

Re: php exec - befehl an shell übergeben

Post by schwannek » 2007-08-23 23:22

/bin/ls -alh / > ./ls.txt

insgesamt 92K
drwxr-xr-x 22 root root 4,0K 2007-08-23 23:05 .
drwxr-xr-x 22 root root 4,0K 2007-08-23 23:05 ..
lrwxrwxrwx 1 root root 39 2007-08-16 16:28 aquota.group -> /proc/vz/vzaquota/0000001f/aquota.group
lrwxrwxrwx 1 root root 38 2007-08-16 16:28 aquota.user -> /proc/vz/vzaquota/0000001f/aquota.user
drwxr-xr-x 2 root root 4,0K 2007-08-15 07:50 bin
drwxr-xr-x 2 root root 4,0K 2006-04-23 03:50 boot
drwxr-xr-x 6 root root 12K 2007-08-16 16:28 dev
drwxr-xr-x 66 root root 4,0K 2007-08-18 21:14 etc
drwx------ 2 root root 4,0K 2007-06-15 13:45 .gnupg
drwxr-xr-x 5 root root 4,0K 2007-08-16 16:19 home
drwxr-xr-x 7 root root 4,0K 2007-08-15 16:14 lib
-rw-r--r-- 1 root root 0 2007-08-23 23:20 ls.txt
drwxr-xr-x 2 root root 4,0K 2006-04-23 03:51 media
drwxr-xr-x 2 root root 4,0K 2006-04-23 03:51 mnt
drwxr-xr-x 4 root root 4,0K 2007-08-15 16:09 opt
drwxr-xr-x 2 root root 4,0K 2007-03-16 11:42 private-backup
dr-xr-xr-x 525 root root 0 2007-08-16 16:28 proc
-rw------- 1 root root 1,0K 2007-08-15 07:50 .rnd
drwx------ 6 root root 4,0K 2007-08-23 19:54 root
drwxr-xr-x 3 root root 4,0K 2007-08-15 16:14 sbin
drwxr-xr-x 4 root root 4,0K 2007-06-15 13:45 srv
drwxr-xr-x 3 root root 0 2007-08-16 16:28 sys
drwxr-xr-x 2 root root 4,0K 2007-08-18 15:06 test
drwxrwxrwt 8 root root 4,0K 2007-08-23 23:04 tmp
drwxr-xr-x 12 root root 4,0K 2007-08-15 16:14 usr
drwxr-xr-x 14 root root 4,0K 2007-08-15 07:49 var


httpd.conf

[snip]

php.ini

[snip]


[EDIT by Joe User: Kommentierte Configs entsorgt]

User avatar
Joe User
Project Manager
Project Manager
Posts: 11139
Joined: 2003-02-27 01:00
Location: Hamburg

Re: php exec - befehl an shell übergeben

Post by Joe User » 2007-08-23 23:46

schwannek wrote:/bin/ls -alh / > ./ls.txt

Per Shell, oder per PHP ausgeführt?

Und wenn ich `grep ...` schreibe, dann meine ich es auch. Und wenn Du schon vollständige Configs postest, dann ohne die überflüssigen, da jedem Admin bekannt, Kommentare.

BTW: So unverständlich ist die PHP-Dokumentation gar nicht, man muss sie nur hin und wieder mal lesen...

schwannek
Posts: 49
Joined: 2007-03-15 20:05

Re: php exec - befehl an shell übergeben

Post by schwannek » 2007-08-24 15:27

/bin/ls -alh / > ./ls.txt

per shell

da er über php keine datei erzeugt hat.

grep -i error_log /etc/php5/apache2/php.ini

; Log errors into a log file (server-specific log, stderr, or error_log (below))
; Set maximum length of log_errors. In error_log information about the source is
;error_log = filename
;error_log = syslog



grep -i errorlog /etc/apache2/httpd.conf

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
ErrorLog /var/log/apache2/error_log




grep -i errorlog /var/log/apache2/error_log


ist leer

User avatar
Joe User
Project Manager
Project Manager
Posts: 11139
Joined: 2003-02-27 01:00
Location: Hamburg

Re: php exec - befehl an shell übergeben

Post by Joe User » 2007-08-24 16:22

OK, als Erstes trägst Du in der php.ini am Ende des Blocks [php] folgende Zeilen nach und restartest anschliessend den Apache:

Code: Select all

error_reporting = E_ALL & ~E_NOTICE
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
report_zend_debug = 0
track_errors = Off
html_errors = Off
error_log = "/var/log/apache2/phperr_log"

Jetzt führst Du das folgende PHP-Script aus und postest danach den Inhalt von /var/log/apache2/phperr_log:

Code: Select all

<?php
error_reporting(E_ALL);
system("/bin/ls -alh / > ./ls.txt");
?>

schwannek
Posts: 49
Joined: 2007-03-15 20:05

Re: php exec - befehl an shell übergeben

Post by schwannek » 2007-08-24 17:02

php script ausgeführt (vorher die werte hinzugefügt)



h1322948:/ # cat /var/log/apache2/phperr_log > phperror_log.txt
cat: /var/log/apache2/phperr_log: Datei oder Verzeichnis nicht gefunden
h1322948:/ # cd /var/log/apache2
h1322948:/var/log/apache2 # ls
access_log error_log httpderrorlog.txt rcapache2.out
h1322948:/var/log/apache2 # cat error_log > error_log.txt


error_log.txt
http://uploaded.to/?id=9i89g7

falls es irgendwas zur sachen tuen sollte dies ist lediglich ein vserver

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: php exec - befehl an shell übergeben

Post by daemotron » 2007-08-24 20:00

Code: Select all

sh: /ping: No such file or directory
sh: /ping: No such file or directory
sh: /ls: No such file or directory
sh: /ls: No such file or directory
sh: /ls: No such file or directory
sh: /ls: No such file or directory
sh: /ls: No such file or directory
sh: /ls: No such file or directory
sh: /ping: No such file or directory
Noch Fragen?

schwannek
Posts: 49
Joined: 2007-03-15 20:05

Re: php exec - befehl an shell übergeben

Post by schwannek » 2007-08-25 13:59

Noch Fragen?


jop, findet er nicht, was mach ich n jez damit er den findet :)

Roger Wilco
Administrator
Administrator
Posts: 5924
Joined: 2004-05-23 12:53

Re: php exec - befehl an shell übergeben

Post by Roger Wilco » 2007-08-25 14:16

schwannek wrote:jop, findet er nicht, was mach ich n jez damit er den findet :)

Den kompletten Pfad angeben oder $PATH korrekt setzen...

schwannek
Posts: 49
Joined: 2007-03-15 20:05

Re: php exec - befehl an shell übergeben

Post by schwannek » 2007-08-25 14:30

dann müsste doch eigentlich

/bin/ping

funktionieren, ist doch der komplette path.

h1322948:/ # whereis ping
ping: /bin/ping


also

<?php

$Meldung = exec("/bin/ping -c 1 web.de", $RueckgabeProgramm, $RueckgabeStatus);

echo$Meldung,
"<br><br>";

if($RueckgabeStatus == 0)
{
echo"<font color="green">Ping erfolgreich</font>";
}
else
{
echo"<font color="red">Ping nicht erfolgreich</font>";
}

?>


tut es aber nicht O_o

schwannek
Posts: 49
Joined: 2007-03-15 20:05

Re: php exec - befehl an shell übergeben

Post by schwannek » 2007-08-27 18:25

oder liegt es vllt garnicht am path?

dtdesign
Posts: 391
Joined: 2006-09-05 21:12
Location: Berlin

Re: php exec - befehl an shell übergeben

Post by dtdesign » 2007-08-27 18:34

Ich weiss ja nicht, was du da treibst...

test.php

Code: Select all

<?php
        exec("/bin/ping -c 1 www.web.de", $return, $state);

        foreach($return as $key => $value)
        {
                echo "{$value}n";
        }

        echo "nnStatus: {$state}n";
?>


Ausgabe:

Code: Select all

dtdesign@devserver-2:~$ php test.php
PING www.web.de (217.72.195.42) 56(84) bytes of data.
64 bytes from ha-42.web.de (217.72.195.42): icmp_seq=1 ttl=59 time=0.558 ms

--- www.web.de ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.558/0.558/0.558/0.000 ms


Status: 0
dtdesign@devserver-2:~$


Wichtig: Der Status lautet 0 obwohl der Ping erfolgreich war.

Gruß
dtdesign

schwannek
Posts: 49
Joined: 2007-03-15 20:05

Re: php exec - befehl an shell übergeben

Post by schwannek » 2007-08-27 23:41

hmm jo machs ja genau so wie es gemacht werden soll. desshalb hab ich ja auch keinen plan warum es nicht klappt..

bei deinem code...

<?php
exec("/bin/ping -c 1 http://www.web.de", $return, $state);

foreach($return as $key => $value)
{
echo "{$value}n";
}

echo "nnStatus: {$state}n";
?>


bekomm ich die ausgabe

Status: 127


ist ja schonmal was... aber halt überhaupt nicht das was ich erwartet hätt :)


wasn da los?!