Funktion system() funktioniert nur bei gleichem Pfad

nietaL

NGBler
Registriert
8 Sep. 2013
Beiträge
231
Ort
Exilgullianer
Das Programm cpbo.exe packt Ordner zu einer pbo-Datei. Dazu bedarf es der untenstehenden Parameter.

Liegt das Skript, die cpbo.exe, der Quellordner (test.Altis) und der Zielpfad (test.pbo) im selben Verzeichnis, funktioniert alles tadellos.

[src=php]system("start /b cpbo.exe -y -p test.Altis test.pbo", $output);
echo $output;
[/src]

Jetzt möchte ich aber das aufrufende Skript eine Ebene höher ablegen. Beim Aufruf kommt nach 60sek ein 500er Fehler.

[src=php]system("start /b missions/cpbo.exe -y -p test.Altis test.pbo", $output);
echo $output;
[/src]

Die Pfade als Parameter für die Exe sind doch sicherlich immer relativ zu EXE anzugeben, bleiben also unverändert. Ich vermute meinen Fehler eher im Pfad zur Exe selbst. Ich hab auch schon versucht absolute Pfade anzugeben. Darf man überhaupt relative Pfade zum auszuführenden Command angeben?
 
Ich kenne die Software nicht, aber ich würde ganz stark vermuten, das der Aufrufpfad des Programms:
"missions/cpbo.exe" zwar korrekt aufruft,
aber das Programm nicht versteht, das die zu bearbeitenden Daten sich eine Ebene tiefer im Pfad befinden.

Ich glaube, aber dass das Programm es nicht unterstützt wenn du
"../test.Altis ../test.pbo" oder "./test.Altis ./test.pbo"
übergibst um im zu sagen, "schau eine Ebene höher als du selbst liegst... mußt du testen, ich würde aber, aus Sicherheitsgründen, zu 99% verneinen das dies möglich ist :)

Mußt du zwingend diese Struktur mit einer Ebene höher als im anderen Verzeichnis beibehalten?

Normalerweise hätte man ja das Programm in der untersten Ebene und würde ihm Angeben das die Pfade/Daten darunter liegen mit denen gearbeitet wird. Also ums einfacher zu sagen, die Daten die du mit der Software bearbeiten willst, liegen im Programm bzw. Unterordner👎 davon ausgehend.

Ich würde es als Sicherheitsrisiko betrachten wenn eine Software außerhalb Ihres Speicherorts arbeitet. Aber ist vielleicht nur meine naive Meinung. Gerade wenn du etwas mit "system" / "exec" oder "eval" oder ähnlichem übergeben lässt was Code/andere Software ausführt.
 
  • Thread Starter Thread Starter
  • #3
Danke erst einmal für deine Antwort. Aber ich glaube, ich habe mich missverständlich ausgedrückt. Nur das aufrufende Skript liegt eine Ebene höher. Programm und zu bearbeitende Dateien sind auf gleicher Ebene:

Struktur bei ersterem Codebeispiel:

ORDNER 1
- cpbo_starten.php
- cpbo.exe
- test.Altis
- test.pbo (vorhanden, wenn erfolgreich)

Wunschstruktur zweites Codebeispiel

ORDNER 0
- cpbo_starten.php
- ORDNER 1
|-- cpbo.exe
|-- test.Altis
|-- test.pbo (wurde ja leider noch nicht erstellt)

Mir geht es vornehmlich um die Syntax der Pfads, hier dickgedruckt:
system("start /b missions/cpbo.exe -y -p test.Altis test.pbo", $output);

Ist das so richtig? Ist der Slash richtig herum? Muss etwas markiert werden? Fehlen Anführungszeichen? Darf man relative Pfade nehmen? An irgendetwas muss es doch liegen, dass er sich aufhängt.
 
Versuch mal die Pfade relativ zum PHP-Script anzugeben:
[src=php]system('start /b "missions/cpbo.exe" -y -p "missions/test.Altis" "missions/test.pbo"', $output);[/src]Im Zweifelsfall würde ich aber tatsächlich zu absoluten Pfadangaben tendieren. Dabei kann hilfreich sein.
[kw]/[/kw] brauchst du übrigens auf Linux/Mac-Systemen, [KW]\[/KW] auf Windows-Systemen. Ich nutze da gerne sowas wie: [src=php]define('DS', DIRECTORY_SEPARATOR);
$path = 'folder' . DS . 'test.file';[/src]

Falls du vorhast, dass die Benutzer deiner Seite eigene Dateien verarbeiten können, weise ich schonmal vorsorglich auf hin ;)
 
Ist der Slash richtig herum?
Ist es so hart das selber auszuprobieren? Bin hier nur zufällig reingestolpert, aber warum kein backslash um einen relativen Pfad bei Windows anzugeben?
 
  • Thread Starter Thread Starter
  • #6
@BurnerR: Wäre das meine einzige Frage, hätte ich es ausprobiert. Das wäre mir dann auch nicht zu "hart"... Aber es ergeben sich quasi zig Kombinationsmöglichkeiten. Und bevor ich herumrate, frage ich lieber nach Rat.

@Rakorium-M: Es handelt sich um einen Windows-Server.

[src=php]system("start /b missions\cpbo.exe -y -p missions\test.Altis missions\test.pbo", $output);
[/src]

[src=php]system("start /b missions\cpbo.exe -y -p test.Altis test.pbo", $output);
[/src]

[src=php]system("start /b C:\inetpub\vhosts\XXXXXX.XXXXserver.de\httpdocs\missions\cpbo.exe -y -p test.Altis test.pbo", $output);
[/src]

Alles führt zum Timeout.
 
Also, vielleicht solltest du mal Raktorium-M s-Variante ausprobieren... ansonsten kommt das Programm vielleicht nicht mit Pfadangaben als Parameter klar, sondern nur mit direkten Dateinamen... ?
Da ließe sich doch bestimmt auf der "Herstellerseite" bzw. in einer Doku etwas finden oder andere Projekte wo das Werkzeug zum Einsatz kommt, anderer Quellcode der vielleicht Public Domain ist. ;)

Und auch als Tip, User Input NIE vertrauen, falls du den Systemaufruf dynamisch zusammenbauen lassen willst. Immer escapen/absichern/Pfade entfernen und nur Dateinamen verwenden et cetera, wie bereits vorgeschlagen. :)
 
  • Thread Starter Thread Starter
  • #8
Danke für den Tip. Es wird keinen UserInput in Textform geben. Dennoch werde ich das Escapen beherzigen!

Ich habe jetzt probehalber das funktionierende "Alles auf einer Ebene"-Skript komplett eine Ebene hochgeschoben. Siehe da: TimeOut. Hieß also, das Skript ist gar nicht schuld. Es waren die Rechte des beinhaltenden Ordners. In diesem Fall hatte Ordner 1 mehr Rechte als Ordner 0. Nun geht es. Danke noch einmal für die Hinweise.

PS: Im Übrigen musste tatsächlich auch der Pfad des Programms angepasst werden. Das verstehe ich zwar nicht wirklich, aber es funktioniert - auch nur mit escapten Backslashes.
[src=php]system("start /b missions\cpbo.exe -y -p missions\\test.Altis missions\\test.pbo", $output);[/src]
 
Zuletzt bearbeitet:
PS: Im Übrigen musste tatsächlich auch der Pfad des Programms angepasst werden. Das verstehe ich zwar nicht wirklich, aber es funktioniert - auch nur mit escapten Backslashes.
[src=php]system("start /b missions\cpbo.exe -y -p missions\\test.Altis missions\\test.pbo", $output);[/src]
Auch wenn das Problem zwar gelöst ist, noch ein kleiner Hinweis von mir:
- Pfade werden in aller Regel relativ zum "Aktuellen Arbeitsverzeichnis" (Current diretory) aufgelöst. Wenn ein Programm ein anderes aufruft, wird die Umgebung, also das Arbeitsverzeichnis, Umgebungsvariablen usw. vom Aufrufer übernommen. Wenn nötig kann der Aufrufer das Arbeitsverzeichnis vorher wechseln, z.B. mit chdir("missions"); (und danach wieder zurück), in deinem Fall würde ich das aber vermeiden.
- Windows unterstützt auch den "/" als Pfadtrenner. Bis auf ein paar wenige Programme die damit nicht klarkommen kann man einfach / verwenden statt \ und spart sich dadurch das ständige escapen.
 
Zurück
Oben