Page 1 of 2
php exec - befehl an shell übergeben
Posted: 2007-08-22 16:16
by schwannek
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.
Re: php exec - befehl an shell übergeben
Posted: 2007-08-22 17:28
by bernsteinkater
schwannek wrote:ping -n 1 web.de
Versuch mal:
Re: php exec - befehl an shell übergeben
Posted: 2007-08-22 17:31
by Joe User
Re: php exec - befehl an shell übergeben
Posted: 2007-08-22 21:20
by schwannek
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?
Re: php exec - befehl an shell übergeben
Posted: 2007-08-22 21:48
by rootsvr
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
Re: php exec - befehl an shell übergeben
Posted: 2007-08-23 12:59
by bernsteinkater
schwannek wrote:ping -n 1 web.de
hat nichts gebracht...
Daher schrieb ich ja auch "ping -c 1 web.de"
Re: php exec - befehl an shell übergeben
Posted: 2007-08-23 20:45
by schwannek
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
Re: php exec - befehl an shell übergeben
Posted: 2007-08-23 20:55
by daemotron
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".
Re: php exec - befehl an shell übergeben
Posted: 2007-08-23 21:08
by schwannek
danke für den tipp
Da fehlt ein Leerzeichen zwischen "echo" und "$Meldung".
war aber nicht die ursache ;)
Ping nicht erfolgreich
Re: php exec - befehl an shell übergeben
Posted: 2007-08-23 21:10
by Joe User
Darf der User überhaupt pingen? Mal mit vollständigem Pfad versucht? exec-Alternativen versucht?
Re: php exec - befehl an shell übergeben
Posted: 2007-08-23 21:48
by schwannek
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?
Re: php exec - befehl an shell übergeben
Posted: 2007-08-23 22:15
by daemotron
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:
Kleiner Hinweis am Rande: Das ist Linux/*NIX Grundlagenwissen. Wenn Du einen Server administrieren willst, solltest Du es schleunigst nachholen, Dir das anzueignen...
Re: php exec - befehl an shell übergeben
Posted: 2007-08-23 22:24
by Joe User
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
Re: php exec - befehl an shell übergeben
Posted: 2007-08-23 23:22
by schwannek
/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]
Re: php exec - befehl an shell übergeben
Posted: 2007-08-23 23:46
by Joe User
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...
Re: php exec - befehl an shell übergeben
Posted: 2007-08-24 15:27
by schwannek
/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
Re: php exec - befehl an shell übergeben
Posted: 2007-08-24 16:22
by Joe User
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");
?>
Re: php exec - befehl an shell übergeben
Posted: 2007-08-24 17:02
by schwannek
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
Re: php exec - befehl an shell übergeben
Posted: 2007-08-24 20:00
by daemotron
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?
Re: php exec - befehl an shell übergeben
Posted: 2007-08-25 13:59
by schwannek
Noch Fragen?
jop, findet er nicht, was mach ich n jez damit er den findet :)
Re: php exec - befehl an shell übergeben
Posted: 2007-08-25 14:16
by Roger Wilco
schwannek wrote:jop, findet er nicht, was mach ich n jez damit er den findet :)
Den kompletten Pfad angeben oder $PATH korrekt setzen...
Re: php exec - befehl an shell übergeben
Posted: 2007-08-25 14:30
by schwannek
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
Re: php exec - befehl an shell übergeben
Posted: 2007-08-27 18:25
by schwannek
oder liegt es vllt garnicht am path?
Re: php exec - befehl an shell übergeben
Posted: 2007-08-27 18:34
by dtdesign
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
Re: php exec - befehl an shell übergeben
Posted: 2007-08-27 23:41
by schwannek
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?!