Cmd mit php code starten und ausführen. [php]

Diskordier

Neu angemeldet
Registriert
14 Juli 2013
Beiträge
161
Hallo leute, ich möchte über einen Button auf einer Webseite, ein programm in cmd starten mit bestimmten mit gegebenen datensätze.

Noch steh ich noch gant am Amfang und ich scheitere schon daran mit php Notepad auf meinem pc zu starten

[src=php]if ($_POST["sn"] == "cr"){

exec('C:\Windows\System32/cmd.exe /c start notepad++"');



exec('cmd.exe /c "C:\xampp\htdocs\_start.bat"'); [/src]

nur bekomme ich leider keinen Fehler angezeigt so das mir nicht kar ist wo der fehler liegt.

mir ist klar das man notepad nicht auf einem server starten soll , ist ja nur mal zum testen, das was ich dann starten will wird nur in der cmd ausgeführt.
 
Zuletzt bearbeitet:
Der exec-Befehl führt in einer Windows-Umgebung laut den Kommentaren der Dokumentation "cmd /c command" aus. Das bedeutet also, dass du dir den Anfang schonmal sparen kannst. Außerdem besteht die Frage, ob notepad++ zur Path-Variable hinzugefügt wurde, ohne die das natürlich nicht geht. Zudem: Wo sind die ersten doppelten Anführungszeichen? Die brauchst du nicht, ab PHP/5.3 werden die Anführungszeichen automatisch angefügt (falls du sie also da hast, wird das Programm scheitern).
 
  • Thread Starter Thread Starter
  • #3
also ich brauche die doppelten Anführungszeichen sonst failt das programm.

so ich hab nun folgendes, die bat wird nun wohl gestartet. jedoch wird sie direkt ausgeführt im prinzip soll die bat gestartet werden und dann wir danach noch eine variable an cmd übergeben und ausgeführt damit die bat das richtige macht , nur bekomme ich es nicht hin cmd was mit zu geben sprich die bat wird ausgeführt ohne eine mit gegebene variable.

[src=php] system('cmd.exe /c "C:\xampp\htdocs\_start.bat", $crlink ');[/src]

es gibt ja noch

shell_exec($Link);
 
Läuft dein Script auf einem Windows oder einem Unix-artigen System (Linux, Mac)?
Der Verzeichnisstruktur nach wohl unter Windows.


Außerdem wäre es interessant deine System/ PHP-Konfiguration zu kennen.
Welche PHP Version verwendest du und ist der Safe Mode aktiviert?
exec verhält sich, je nach dem unterschiedlich.

Außerdem solltest du beachten:

php.net schrieb:
Falls Sie diese Funktion benutzen, um ein Programm zu starten und im Hintergrund weiterlaufen lassen möchten, müssen Sie sicherstellen, dass die Ausgabe des Programms in eine Datei oder einen anderen Ausgabestream umgeleitet wird. Anderenfalls wird PHP solange hängen, bis das Programm zu Ende ausgeführt wurde.

Bei notepad wird das Programm starten und da es theoretisch "weiterläuft" bis es manuell beendet wird, wird auch entsprechend dein PHP-Script hängenbleiben. [Irgendwann timeouted es natürlich.] Gleiches gilt für system und passthru. Allgemein bin ich nicht sicher, ob es sinnvoll ist GUI-Programme via Script zu starten.

Versuch doch erst mal einen VLC Server zu starten, der braucht nämlich nicht zwangsweise eine grafische Oberfläche und du hast über den Soundoutput eine gute Kontrollmöglichkeit, ob dein Kommando ausgeführt wird:

Windows, VLC 64bit:
[src=bash]C:\Program Files\VideoLAN\VLC\vlc.exe -I http http://download.wavetlan.com/SVV/Media/HTTP/MP3/Helix_Mobile_Producer/HelixMobileProducer_test2_MPEG1_Stereo_CBR_96kbps_32000Hz.mp3[/src]
Windows, VLC 32bit:
[src=bash]C:\Program Files\VideoLAN (x86)\VLC\vlc.exe -I http http://download.wavetlan.com/SVV/Media/HTTP/MP3/Helix_Mobile_Producer/HelixMobileProducer_test2_MPEG1_Stereo_CBR_96kbps_32000Hz.mp3[/src]

Beschwerden wegen des MP3-Files bitte nach /dev/null, das war die einzige MP3 Datei, die ich auf die Schnelle frei im Web finden konnte. ;)

In PHP könnte das etwa so aussehen:

[src=php]<?php
# Konfiguration:

// 64bit player verwenden
// true präferiert den 64bit player
// false präferiert den 32bit player
$prefere64 = true;

// Standardverzeichnisse für VLC
$players = array(0 => "C:\Program Files\VideoLAN\VLC\vlc.exe", 1 => "C:\Program Files\VideoLAN (x86)\VLC\vlc.exe");

// Sample Mediadatei
$media = "http://download.wavetlan.com/SVV/Media/HTTP/MP3/Helix_Mobile_Producer/HelixMobileProducer_test2_MPEG1_Stereo_CBR_96kbps_32000Hz.mp3";

// Musikbibliothek
$dldir = "Downloads";

// Helferlein
function initLib($dldir, $media){
// Bibliothek anlegen, falls nicht existent
if(!is_dir($dldir)){mkdir($dldir);}

// Dateinamen aus Pfad extrahieren
$pi = pathinfo($media);
$bn = $pi['basename']; // HelixMobileProducer_test2_MPEG1_Stereo_CBR_96kbps_32000Hz.mp3
// Zieldatei
$filepath = $dldir . DIRECTORY_SEPARATOR . $bn;

// Datei in Bibliothek importieren, falls nötig
$result = false;
if(!file_exists($filepath)){
$content = file_get_contents($media); // Binary lesen
$result = file_put_contents($dldir . DIRECTORY_SEPARATOR . $bn, $content); // Binary schreiben
// Windows: Downloads/HelixMobileProducer_test2_MPEG1_Stereo_CBR_96kbps_32000Hz.mp3
// Unix: Downloads\HelixMobileProducer_test2_MPEG1_Stereo_CBR_96kbps_32000Hz.mp3
}else{
$result = true; // file existiert
}

return $result;
}

// Bibliothek initialisieren
initLib($dldir, $media);

// Helferlein
function selectPlayer($players, $prefere64){
// kein 64bit, dann drehe die Liste
$players = (!$prefere64) ? array_reverse($players) : $players;

// suche den ersten installierten Player
foreach($players as $player){
if(file_exists($player)){
return $player;
}
}

// kein Player gefunden
return false;
}

if(($player = selectPlayer($players, $prefere64))!==false){
// starte Player mit http Interface und Mediafile
exec($player . ' -I http ' . $media);
}else{
// Warnung
die('No supported player found!');
}
?>[/src]
 
Zuletzt bearbeitet:
schon alleine aus Sicherheitsgründen würde ich deine Variable / den zu Übergebenden Wert in eine Datenbank speichern und dann lieber mit passenden Rechten einen Cron / Taskplaner laufen lassen der z.B. alle 5s deinen Befehl ausführt und die Werte aus einem File / der DB ausliest...
Dann hast du zum einen Rechtetrennung zwischen Webserver und der auszuführenden Aufgabe und kannst zum anderen Sicherstellen das nicht irgendwas in den exec() Befehl eingeschleust wird... Ganz davon abgesehen das der Befehl nicht Grundlos auf vielen Systemen deaktiviert ist (weiß ja nicht wo und wie du das später produktiv laufen lassen möchtest.)
 
Das ist natürlich ein sinnvoller Beitrag. Allerdings hoffe ich, dass dem TS klar ist, welche Sicherheitsrisiken ein exec reißen kann, wenn freie Nutzereingaben verarbeitet werden.
 
Zurück
Oben