php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.04.2005, 12:11  
Gast
 
Beiträge: n/a
Standard [Erledigt] "du" (disk usage) durch "exec()" ausführ

Hallo!

Ich habe ein kleines Problem bei der Ausführung des "du"-Befehls (disk usage) auf einem Linux-System.
Der Befehl soll inerhalb eines PHP-Skriptes ausgeführt werden, um es Benutzern, die nicht so viel von Linux verstehen, zu ermöglichen, die Verzeichnisauslastungen bestimmter Verzeichnisse zu beobachten.
Im Klartext: Ich will den "du"-Befehl in einem PHP-Skript auf dem Webserver ausführen und die Ausgaben als Text im Browser ausgeben lassen.

Der dazu von mir geschriebene Quekllcode sieht so aus:
Code:
<?php
$myarray = array();
unset($myarray);
exec("du --max-depth=1 -BM /mnt/aragorn_home/ | sort -n -r", $myarray);
foreach($myarray as $line){
	echo $line;
	echo "
";
}
?>
Das Verzeichnis /aragorn_home/ ist ein gemountetes Verzeichnis auf dem Webserver. Wenn ich den Befehl "du --max-depth=1 -BM /mnt/aragorn_home/ | sort -n -r" manuell auf dem Linux-Rechner ausführe, dann läuft alles perfekt (dauert halt nur etwas). Die Ausgabe sieht dann so aus:

6219 /mnt/aragorn_home
2916 /mnt/aragorn_home/boston
1575 /mnt/aragorn_home/extern
1558 /mnt/aragorn_home/navi
67 /mnt/aragorn_home/hasasem
60 /mnt/aragorn_home/lesniak
36 /mnt/aragorn_home/mok
6 /mnt/aragorn_home/Ermert
3 /mnt/aragorn_home/wakhaled
2 /mnt/aragorn_home/khaledvideo
1 /mnt/aragorn_home/keitmann
0 /mnt/aragorn_home/sch_klinik
0 /mnt/aragorn_home/mkl
0 /mnt/aragorn_home/liffers
0 /mnt/aragorn_home/hansen
0 /mnt/aragorn_home/Wilko

In einem PHP Skript ausgeführt gibt das Skript dann allerdings die folgende Ausgabe:

1 /mnt/aragorn_home

Warum gibt er mir nicht die vollständige Bildschirmausgabe des Befehls zurück?
Meine erste Annahme ist nun, dass der Fehler dadurch passiert, dass der Befehl "du" rekursiv strukturiert ist und daher der "exec"-Befehl nach dem ersten Aufruf schon die Ausgabe tätigt und den Rest nicht mehr berücksichtigt. Aber das ist wie gesagt nur eine Vermutung...

Kann mir jemand bei dem Problem helfen???

Schonmal danke im Vorraus für Eure Bemühungen!

Carsten
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.04.2005, 13:17  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hm... also bei mir gibt dein skript alles vollständig aus.
du könntest ein problem mit den benutzerrechten haben - denn auf der kommandozeile aus läufst du normalerweise mit den user-rechten, vom browser aus mit 'www-data' o.ä. - rechten.
ich hatte vor ein paar monaten das selbe problem - und habe als lösung einen cronjob mit root-rechten laufen lassen, der das ergebnis der du - abfrage in eine textdatei gepackt hat, und dann die daten in einer mysql-datenbank zur statistiken-erstellung etc. gespeichert hat.
axo ist offline   Mit Zitat antworten
Alt 08.04.2005, 13:31  
Gast
 
Beiträge: n/a
Standard

Die Lösung mit dem Cronjob haben wir bisher auch teilweise laufen. Allerdings wollten wir die Statistik eben "on demand" laufen lassen, damit bei Bedarf nicht immer gewartet werden muss.
Wenn es ein Rechteproblem sein sollte, dann könnte ich ja prinzipiell den Web-Server mit root-Rechten laufen lassen. Allerdings wäre das ein erhebliches Sicherheitsproblem...
Wäre es vielleicht möglich mit dem Befehl "su" entsprechende Administratorrechte zu bekommen und dann den Befehl ausführen zu lassen? Die Frage ist dann nur, ob man diesen Befehl in ein PHP bzw im Notfall auf ein Perl-Skript einbinden und nutzen kann. Soweit ich weiß erwartet "su" ja nach der Eingabe des Benutzernamen das Passwort des Benutzers - in meinem Fall das root-Passwort. In PHP habe ich aber noch keine Möglichkeit gesehen während der Laufzeit eines mit "exec" aufgerufenen Programms weitere Eingaben für dieses Programm über das Skript zu tätigen.

Die Lösung dieses Problems würde mir aber auch bei einem anderen Problem helfen, bei dem ich root-Rechte für ein Programm benötige...
Ich wäre da für eine Hilfe superdankbar!

Carsten
  Mit Zitat antworten
Alt 08.04.2005, 13:42  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Excalibur2404
Wenn es ein Rechteproblem sein sollte, dann könnte ich ja prinzipiell den Web-Server mit root-Rechten laufen lassen. Allerdings wäre das ein erhebliches Sicherheitsproblem...
allein für das in-betracht-ziehen so einer möglichkeit würde ich dich fristlos feuern, gell?
Zitat:
Wäre es vielleicht möglich mit dem Befehl "su" entsprechende Administratorrechte zu bekommen und dann den Befehl ausführen zu lassen?
nein, das läuft nicht wirklich gut. du kannst dir aber angucken, wie sudo funktioniert. bleibt trotzdem die sicherheitslücke, dass damit potenziell alle kunden die disk-usage-daten ihrer nachbarn herausfinden können. die sicherste methode bleibt die cronjob-methode. 'du' speichert selbst ergebnisse zwischen - womit man evtl. die statistik öfter laufen lassen könnte, um die on-demand-funktionalität anzunähern. ist aber jetzt keine sonderlich durchdachte idee.
axo ist offline   Mit Zitat antworten
Alt 08.04.2005, 16:31  
Gast
 
Beiträge: n/a
Standard

Danke, dann werde ich mich mal in sudo einarbeiten... Vielleicht bekomme ich das Problem dadurch in den Griff.
  Mit Zitat antworten
Alt 18.04.2005, 11:48  
Gast
 
Beiträge: n/a
Standard

warum mit exec?

Sorry das ich das mal so sage, aber wenn du an die sicherheit denkst, dann lass es doch PHP mit seiner dir-class machen. du kannst doch mit php genauso berechnen wie "du" per exec. nur hast du halt kein problem mehr mit den rechten

Gruß MasterNemo
  Mit Zitat antworten
Alt 18.04.2005, 13:09  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von MasterNemo
warum mit exec?

Sorry das ich das mal so sage, aber wenn du an die sicherheit denkst, dann lass es doch PHP mit seiner dir-class machen. du kannst doch mit php genauso berechnen wie "du" per exec. nur hast du halt kein problem mehr mit den rechten

Gruß MasterNemo
ROFL! hahahahahhahah
du bist echt lustig. der fehler fängt ja bereits bei "wenn du an sicherheit denkst, dann lass es doch PHP machen" an!

der zweite fehler:
hast du jemals in deinem leben benchmarks gemacht?

"du" ist, um das selbe ergebnis zu liefern wie eine rekursive php-funktion zum durchsuchen von ordnern und dem zusammenzählen der dateigrößen ungefähr 50-100 mal schneller. das liegt daran, dass "du " ein für diesen speziellen fall kompiliertes und optimiertes programm mit einem ordentlich durchdachten algorithmus ist.

du kannst kein php-skript derart optimieren, dass es einem guten binary das wasser reicht. wir reden doch hier nicht vom überprüfen von 30 10-kb-dateien, sondern vom on-the-fly-generieren von informationen über beliebig viele daten, beispielsweise auch mal 10 GB auf einmal. hast du mal geschaut, wie viele sekunden "du" bei 30 GB rödeln muss und mit der laufzeit eines php-skripts verglichen, das die selbe information holen soll? ich bin ja mal gespannt.

außerdem solltest du mal darüber nachdenken, dass nicht nur das www-verzeichnis eines benutzers mitgezählt werden muss, sondern das komplette homeverzeichnis, und das enthält normalerweise die access logs und mailboxen. und jetzt erzähl du mir, wie du mit php auf einem ordentlichen webserver, dessen betriebssystem-name nicht mit WIN* anfängt und der nicht von einem stümper administriert wird, die dateigröße deines logfiles herausfindest.
axo ist offline   Mit Zitat antworten
Alt 18.04.2005, 14:05  
Gast
 
Beiträge: n/a
Standard

PHP-Code:
<?php
echo shell_exec("Befehl");
?>
dürfte dein problem lösen
  Mit Zitat antworten
Alt 18.04.2005, 14:10  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Zitat:
Zitat von chr1z
PHP-Code:
<?php
echo shell_exec("Befehl");
?>
dürfte dein problem lösen
behebt nciht das angesprochene problem sicherheit, desweiteren funktioniert die lösung doch schon so wie sie oben steht.
robo47 ist offline   Mit Zitat antworten
Alt 18.04.2005, 14:40  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

kann man nicht auch einzelne unqualifizierte antworten in den anfängerbereich verschieben?
axo ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php du, php disk usage, linux disk usage, du disk usage, php exec laufzeit, verzeichnisauslastung linux, php exec du, linux befehl disk usage, disk usage linux befehl, linux du disk usage, php disk_usage, linux du-befehl läuft nicht, disk usage du -h -s, linux diskusage schnell, exec du, php exec \du\, exec du linux, diskusage php linux, linux verzeichnisauslastung ansehen, linux befehl du -sck * | sort

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:28 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.