PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit exec(ps -Aef), anderes verhalten als in der Shell



netlinker
08-12-2005, 19:08
Hi zusammen,

ich wollte mittels exec(ps -Aef | grep ....) bestimmte Prozesse auflisten, jedoch gibt php mit nicht die gleiche Ausgabe, wie sie auf der Shell zu sehen ist.

Die Zeilen werden nicht ganz angezeigt und auf den nicht angezeigtn Teil kann ich auch nicht mehr grep(en).
Was mache ich an dieser Stelle falsch?

Hier noch die Ausgaben, die ich erhalte.


<?
exec ("ps -Aef | grep wwwrun",$prozesse);

foreach($prozesse as $outputline){
echo("$outputline<br>");
}
?>


Ausgabe im Browser:
wwwrun 19024 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc
wwwrun 19025 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc
wwwrun 19026 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc
wwwrun 19027 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc
wwwrun 19028 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc
wwwrun 2095 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc
wwwrun 574 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc
wwwrun 23261 19026 0 19:55 ? 00:00:00 sh -c ps -Aef | grep wwwrun
wwwrun 23262 23261 0 19:55 ? 00:00:00 ps -Aef
wwwrun 23263 23261 0 19:55 ? 00:00:00 grep wwwrun


Ausgabe in der Shell
# su -s /bin/bash -c "ps -Aef | grep wwwrun" wwwrun
wwwrun 19024 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 19025 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 19026 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 19027 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 19028 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 2095 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 574 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 23336 17869 0 20:03 pts/0 00:00:00 su -s /bin/bash -c ps -Aef | grep wwwrun wwwrun
wwwrun 23337 23336 0 20:03 pts/0 00:00:00 bash -c ps -Aef | grep wwwrun
wwwrun 23338 23337 0 20:03 pts/0 00:00:00 ps -Aef
wwwrun 23339 23337 0 20:03 pts/0 00:00:00 bash -c ps -Aef | grep wwwrun




<?
exec ("ps -Aef | grep wwwrun | grep conf",$prozesse);

foreach($prozesse as $outputline){
echo("$outputline<br>");
}
?>


Ausgabe im Browser:
wwwrun 23278 23275 0 19:58 ? 00:00:00 grep conf

Ausgabe in der Shell

# su -s /bin/bash -c "ps -Aef | grep wwwrun | grep conf" wwwrun
wwwrun 19024 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 19025 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 19026 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 19027 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 19028 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 2095 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 574 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf
wwwrun 23331 17869 0 20:02 pts/0 00:00:00 su -s /bin/bash -c ps -Aef | grep wwwrun | grep conf wwwrun
wwwrun 23332 23331 0 20:02 pts/0 00:00:00 bash -c ps -Aef | grep wwwrun | grep conf
wwwrun 23334 23332 0 20:02 pts/0 00:00:00 bash -c ps -Aef | grep wwwrun | grep conf
wwwrun 23335 23332 0 20:02 pts/0 00:00:00 grep conf

Bye Bj

Romanday
10-12-2005, 22:25
Hi zusammen,
jedoch gibt php mit nicht die gleiche Ausgabe, wie sie auf der Shell zu sehen ist.

Bye Bj

Das ist schon richtig. Php hat nicht die gleichen Rechte, wie Du als
User auf der Shell, außer Du hast das System falsch konfiguriert.

netlinker
11-12-2005, 20:26
Hi Romanday,

die Rechte scheinen ja ok zu sein.
Das Kommando wird ja auch ausgeführt, wenn ich es über den Browser per php (durch exec) ausführen lasse. Nur bei der Ausgabe unterscheiden sie sich.
Bei der Ausgabe durch PHP werden nur die ersten 70 Zeichen ausgegeben und der Rest wird nicht angezeigt.

Ausgabe:
.PHP: wwwrun 19024 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc
Shell: wwwrun 19024 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf

Romanday
11-12-2005, 22:12
Hi Romanday,

Bei der Ausgabe durch PHP werden nur die ersten 70 Zeichen ausgegeben und der Rest wird nicht angezeigt.


IsT ja spannend. Versuch mal anstadt exec() -> system().
(Sorry. Habe leider jetzt keine Zeit daran rumzubasteln.)

netlinker
13-12-2005, 16:16
Hi Romanday,

bin gerade bei renovieren, daher konnte ich erst jetzt schauen.

Ich habe jetzt mal
system("ps -Aef | grep wwwrun",$prozesse);
anstatt
exec ("ps -Aef | grep wwwrun ",$prozesse);
ausprobiert. Dann ist $prozesse kein Array mehr und ich bekomme als Rückgabe:
wwwrun 19024 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc wwwrun 19025 19023 0 Dec07 ? 00:00:01 /usr/sbin/httpd2-prefork -f /etc wwwrun 19026 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc wwwrun 19027 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc wwwrun 19028 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc wwwrun 2095 19023 0 Dec07 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc wwwrun 574 19023 0 Dec07 ? 00:00:01 /usr/sbin/httpd2-prefork -f /etc wwwrun 13937 19023 0 16:24 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc wwwrun 12213 19028 0 17:11 ? 00:00:00 sh -c ps -Aef | grep wwwrun wwwrun 12214 12213 0 17:11 ? 00:00:00 ps -Aef wwwrun 12215 12213 0 17:11 ? 00:00:00 grep wwwrun 0
Sieht jetzt ziemlich wirr aus, ohne Zeilenumbruch und die Ausgabe wird auch nach 80 (habe mich mit 70Zeichen verzählt, waren immer 80, sry) Zeichen abgeschnitten.


MfG Björn

netlinker
13-12-2005, 17:48
Hi,

habe gerade erlaubt, dass sich wwwrun einloggen darf. (shell von /bin /false auf /bin/bash geändert).

Das Problem liegt daran, das ps keinen Zeilenumbruch macht und somit soviele Zeichen, wie die aktuelle Termlength ausgiebt.
mit der Option -w (wide) fügt ps automatisch Zeilenumbrüche ein und es ist alles zu sehen.

Trotzdem danke,
mfG Björn

netlinker
13-12-2005, 19:07
Naja,

jetzt bin ich der Lösung schon mal näher gekommen, aber ganze habe ich die Lösung noch nicht:

Da meine Zeile ein wenig länger ist, scheint es noch an einer anderen Stelle zu happern:

Die Bash liefert (mit allen Termlenght):
wwwrun 1747 1 0 19:46 ? 00:00:00 /bin/bash /opt/scripte/sonstiges/snmp/snmp-beobachtung.sh all 120 192.168.0.2 var1 var2 var3


PHP liefert:
wwwrun 1747 1 0 19:46 ? 00:00:00 /bin/bash /opt/scripte/sonstiges/snmp/snmp-beobachtung.sh all 120 192.168.0.2 var1 v

Der String ist jetzt genau 132 Zeichen lang.

Na ja, vielleicht finde ich ja noch was :)

Romanday
13-12-2005, 20:08
Naja,

jetzt bin ich der Lösung schon mal näher gekommen, aber ganze habe ich die Lösung noch nicht:

Da meine Zeile ein wenig länger ist, scheint es noch an einer anderen Stelle zu happern:

Die Bash liefert (mit allen Termlenght):
wwwrun 1747 1 0 19:46 ? 00:00:00 /bin/bash /opt/scripte/sonstiges/snmp/snmp-beobachtung.sh all 120 192.168.0.2 var1 var2 var3


PHP liefert:
wwwrun 1747 1 0 19:46 ? 00:00:00 /bin/bash /opt/scripte/sonstiges/snmp/snmp-beobachtung.sh all 120 192.168.0.2 var1 v

Der String ist jetzt genau 132 Zeichen lang.

Na ja, vielleicht finde ich ja noch was :)

Die Shell eine Begrenzung wieviele Zeichen Du pro Zeile darstellen kannst.
Ist also ein Shell Problem.
Lösung: Ausgabe auf XARGS umleiten.
Dann sollte es klappen.

netlinker
13-12-2005, 22:05
Hi,

wer lesen kann ist klar im Vorteil, hätte nur genau in die ps manual schauen müssen:
-w Wide output. Use this option twice for unlimited width.

Aber wie meinst du das mit xargs? xargs würde doch die Ausgabe von drei Zeilen zu einer machen, wenn ich ""ps -Aef | grep wwwrun | xargs" mache, oder wie könnte ich es anders umleiten.

MfG
Björn

Romanday
13-12-2005, 22:19
Hi,

Aber wie meinst du das mit xargs? xargs würde doch die Ausgabe von drei Zeilen zu einer machen, wenn ich ""ps -Aef | grep wwwrun | xargs" mache, oder wie könnte ich es anders umleiten.

MfG
Björn

Das ist schon richtig so, aber Du kannst noch diverse Parameter angegeben.
siehe man xargs

Eine andere Möglichkeit der Gegenkontrolle wäre die Umleitung in
eine Datei gewesen.