PHP-Cli Problem mit exec("ls $path")

Status
Für weitere Antworten geschlossen.

Knipser14

Benutzer
Mitglied seit
10. Mai 2012
Beiträge
12
Punkte für Reaktionen
0
Punkte
0
Hallo Community!

Wie die Überschrift schon zeigt, habe ich ein Problem mit folgender Code-Zeile:

Code:
exec("ls $path")

Wenn ich sie auf meinem eigenen Laptop, mit Ubuntu, ausführe funktioniert alles wunderbar.
Auf dem NAS kommt aber folgende Fehlermeldung:

sh: /usr/syno/bin/ls: not found

Woran kann das liegen?

Sollte ich den PHP safe Mode ausschalten?
Oder liegt es daran, dass ich für IPKG-Installation folgendes aus der PATH-Variablen auskommentieren musste: PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin ?

Es wäre schön, wenn mir jemand weiterhelfen könnte.

Vielen Dank,

Knipser
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
also bei mir ist der ls im Verzeichnis /bin ... vielleicht kannst ja mal exec("/bin/ls $PATH") probieren und schauen, ob dann etwas produziert wird

Itari
 

Knipser14

Benutzer
Mitglied seit
10. Mai 2012
Beiträge
12
Punkte für Reaktionen
0
Punkte
0
Hey Itari,

danke fü deine Antwort.

Ich habe deinen Vorschlag einmal ausprobiert. Leider kommt immer noch die Gleiche Fehlermeldung.
Bei mir liegt ls aber auch im Verzeichnis /bin. Aber anscheind sucht er dort garnicht.

Ich habe auch schon verschiedene Schreibweisen des Befehls ausporbiert, wie:

exec("ls ".$path)

Grüße,

Knipser
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
darf PHP gemäss openbasedir überhaupt auf die Verzeichnisse wo das Kommando drin liegt zugreifen? Auch der SafeMode könnte das Ausführen von Programmen und Kommandos unterbinden
 

Knipser14

Benutzer
Mitglied seit
10. Mai 2012
Beiträge
12
Punkte für Reaktionen
0
Punkte
0
Hallo Jahlives,

vl hast du Recht mit den Zugriffsrechten und auch mit dem SafeMode.

Aber ich habe jetzt eine Lösung gefunden. Und zwar habe ich mittels:

Code:
cd /usr/syno/bin/
ln -s /bin/ls /usr/syno/bin/ls

einen Softlink zu /bin/ls erzeugt. Das klappt dann wunderbar. Musste das dann auch noch für rm etc machen, da diese auch nicht unter /usr/syno/bin liegen und php damit keinen Zugriff hat.

Vielen Dank für eurer beiden Hilfe.

Grüße,

Knipser
 

ubuntulinux

Benutzer
Mitglied seit
23. Jan 2010
Beiträge
2.063
Punkte für Reaktionen
0
Punkte
82
@jahlives shell_exec wird nicht durch openbasedir beeinflusst. Kannst also auch in Verzeichnisse gehen, die per basedir nicht zugelassen sind.
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
funktioniert shell_exec() mittlerweile denn?

Itari
 

ubuntulinux

Benutzer
Mitglied seit
23. Jan 2010
Beiträge
2.063
Punkte für Reaktionen
0
Punkte
82
Gerade geschaut, out of the box nicht :(

@TE: Ev. hilft folgendes auf SSH weiter:

cd /usr/syno/bin/
ln -s /bin/busybox ls
 

horizons

Benutzer
Mitglied seit
01. Okt 2007
Beiträge
67
Punkte für Reaktionen
0
Punkte
6
Hallo stehe gerade vor dem gleichen Problem ich wollte etwas mit php über shell_exec aufrufen.
Ich habe meine php datei in /volume1/web/test.php liegen.
Ein aufruf von was einfachem wie folgendes bringt garnichts (auch nicht wenn ich ls in das /usr/syno/bin/ Verzeichnis symlinked habe)
$output=shell_exec("ls -al");
echo "output: <pre>$output</pre>";

Ein phpinfo() sagt mir
safe_mode Off
safe_mode_exec_dir /usr/syno/bin

Nur sehe ich im user log (welches ich für den user apacher angeschalten habe) folgendes
[Wed May 23 00:31:12 2012] [error] [client 192.168.5.22] PHP Warning: shell_exec(): Cannot execute using backquotes in Safe Mode in /volume1/web/test.php on line 12

ich habe schon alles mögliche in der /usr/syno/etc/php/user-settings-ini geändert und hinzugefügt aber nichts half.

ich habe open_basedir auskommentiert und die anderen werte so gesetzt.
safe_mode_exec_dir =
safe_mode = off
laut phpinfo haben diese dann auch no value nur kommt immer noch der error mit Warning: shell_exec(): Cannot execute using backquotes
eigentlich ist ja ein backquote auch nur ein ` hat dies vielleicht etwas mit den open_basedir Zeilen in /usr/syno/etc.defaults/rc.d/S97apache-user.sh zu tun
z.b.
open_basedir=`/bin/grep ^open_basedir ${SZF_USR_SETTING_INI} | cut -d'=' -f2`

denn irgendwie verstehe ich nicht warum egal was für settings ich setze (natürlich restarte ich den apache) ich kein shell_exec aufrufen kann.
 

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
856
Punkte für Reaktionen
160
Punkte
63
Hi horizons,

wie in den Posts zuvor beschrieben, funktioniert auf der DS das shell_exec() bisher nicht. Versuche mal nur ein exec().

Struppix
 

horizons

Benutzer
Mitglied seit
01. Okt 2007
Beiträge
67
Punkte für Reaktionen
0
Punkte
6
bei exec() kommt eben nur Warning: exec(): PHP exec disable
ich habe eigentlich schon imho alle dinge ausprobiert (mit haken ohne haken im ds webinterface und jegliche settings in der user-settings-ini mal probiert)

disabled ist nichts print_r(ini_get('disable_functions')); weiß also nicht warum exec nichtmal geht.
btw habe immer noch dsm 3.2-1922 installiert falls es daran liegen sollte (muß aber auch dort gehen)

hm irgendwie hatte ich gestern zu später stunde wohl noch was verdummbeutelt.
wenn ich in der user-setting.ini
safe_mode_exec_dir =
setze funktioniert exec nur frage ich mich warum das so ist. wenn ich dort einen pfad drin habe z.b. /usr/syno/bin welcher ja als default eingetragen ich irgendwas daraus aufrufe müsste das doch eigentlich funktionieren.

naja ich habe jetzt mal in meinem bestimmten vhost eintrag der exec rechte haben sollte mal
php_admin_value safe_mode_exec_dir none
eingetragen, damit funktioniert zumindest exec. Ob ich damit weiter komme ist halt die frage wenn man nicht eignenen script und code benutzt und der laufen sollte.
 
Zuletzt bearbeitet:

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
1
Punkte
84
Muss es denn immer PHP sein? Ein normales Shell-Skript oder Perl machen nicht solche Probleme.
 

horizons

Benutzer
Mitglied seit
01. Okt 2007
Beiträge
67
Punkte für Reaktionen
0
Punkte
6
Klar muß es php sein (warum denn auch nicht) wenn man schon den funktionierenden code hat.
ich muß einen prozess starten und auch wieder beenden können und dies übers web.

doof nur dass shell_exec nicht funktioniert. muß doch irgendeinen grund haben, denn bei normalen linux distros ist das ja kein problem (egal welche php version ect)
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
es gibt etliche gute Gründe für den Vorschlag von Merthos z.B. die Geschwindigkeit dürfte bei Perl höher sein als bei PHP. Bei einem Shellscript kannst du u.U. mit weniger Zeilen Code erreichen was in PHP 50 oder 60 Zeilen braucht. Zudem bist du bereits auf der Shell. Drum finde ich persönlich in diesem Fall PHP zu verwenden, letztlich nur um einen Code auf der Shell auszuführen, für den Overkill. Ich meine wieso erst den PHP Interpreter anwerfen nur um damit danach den Shellinterpreter aufzurufen? Man kann Shell resp Perl Scripte als cgi auch via Webserver nutzen
 

horizons

Benutzer
Mitglied seit
01. Okt 2007
Beiträge
67
Punkte für Reaktionen
0
Punkte
6
da liegt das problem 1. bisher keine perl erfahrung gesammelt (ok muss man sich halt ein bisschen mehr reinknien und was neues lernen schadet ja auch nicht) und 2. da ich mich mit php gut auskenne habe ich damit eben die ganze oberfläche meiner web app quasi schon programmiert. mit datenbank und anderen kram. Nun hängts dass was ich machen will eigentlich nur noch an 2 dingen und der eine ist eben das aufrufen und killen von einem prozess. ich werde mal einen kollegen fragen der sich mit perl auskennt eventuell kann ich ja perl aus php raus aufrufen aber ich glaube dafür brauche ich nach "sehr kurzem" googlen auch exec / passthrough da kann ich den prozess auch gleich mit exec starten... naja mal gucken. shell_exec hätte sich halt angeboten weil der teil den ich nicht programmiert habe das nutzt. Und auf anderen "normalen" linux kisten läuft es ja. Frage mich wirklich warum synology den befehl in seinem kompilierten php unterbindet.
 

freezejbc

Benutzer
Mitglied seit
04. Mrz 2010
Beiträge
3
Punkte für Reaktionen
0
Punkte
0
Sorry, wenn ich mich hier einklinke. exec() - Befehle braucht es doch nicht, um ein Verzeichnis auszulesen. Siehe dazu folgender Code:

----------- Schnipp -----------

clearstatcache();
$path = '/volume1/pfadxyz/';
$files = array();
if ($handle = opendir($path)) {
while(false !== ($file = readdir($handle))) {
if ($file != '.' && $file != '..') {
if (!is_dir("$path$file")) {
array_push($files, "$file");
}
}
}
}

----------- Schnapp -----------

Macht folgendes: löscht zunächst mal von PHP eventuell noch bekannte (im internen Cache liegende) File-Listen-Infos, damit auch wirklich der aktuelle Inhalt des Pfads gelesen wird.
Definition des Pfads, in dem die Files gelistet werden sollen.
Definition eines Arrays, öffnen des Pfads in einen handle, und so lange ein File im Pfad gelesen werden kann (und das File nicht "." oder ".." sind, und das File kein Ordner ist - das wird schliesslich auch alles gelistet), stopft man den File-Namen in das Files-Array.

Zum Ausgeben dann noch dieses hinterher:

----------- Schnipp -----------

if (count($files) > 0) {
while(list($key,$value) = each($files)) {
echo "$value<br>";
}
}

----------- Schnapp -----------

Hat man mindestens ein File gefunden (count($files) > 0), dann über den Array humpeln und den Filenamen ausgeben. Nach belieben noch den Pfad voranstellen, sonstwas machen. Das funktioniert einwandfrei.
Auch für Dateisystemoperationen wie "Neuer Ordner" oder "Berechtigungsänderung" hat php das Zeug an Bord: mkdir() und chmod().

Sollte alles im Safemode funktionieren.

Hoffe, geholfen zu haben...

Grüsse
freezejbc
 

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
1
Punkte
84
Andersrum wird ehr ein Schuh draus.

Ich musste noch nie irgendwas für Perl einstellen, und ich hab Skripte (CGIs) auf der DS, die auf alle Dateien zugreifen und dort auch löschen.
 

steff1

Benutzer
Mitglied seit
22. Jul 2012
Beiträge
10
Punkte für Reaktionen
0
Punkte
0
ok, ich habe ja auch hier ein schönes Beispiel von itari gefunden für den Einsatz von CGI wo er die Befehlsbeschreibungen ausgibt. Wenn man aber wenig Erfahrung hat und perl+cgi auf einer Webseite verwenden will scheint das auf der Box nicht ohne weiteres zu gehen.
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat