Programmaufruf mit exec() unter unix
Michael
- php
0 Alexander Foken0 Michael0 Alexander Foken0 Michael0 Alexander Foken0 Michael0 Alexander Foken
Hi,
auf meiner index.php seite gibt es einen button, der auf Klick eine externe datei in der console ausführen soll, die files von einem ordner in einen anderen kopiert.(unter unix)
leider wird die call.php datei garnicht erst aufgerufen.
wo liegt der fehler???
vielen dank michael
in der index.php sieht das script so aus:
<table width="84%" height="30" border="0">
<tr>
<td width="75%" height="26" onClick="call.php">start programm</td>
......
im head steht:
<script type="text/php" src="call.php"></script>
die call.php datei sieht folgendermaßen aus:
<?php
exec ('mpup');
?>
die mpup datei so:
ftp ftp://drmmp:diglmk@10.1.132.211<< ENDE
prompt
mdelete *
mput *
dir
bye
ENDE
/mp/linux_tellmmds -v drmmp diglmk 10.1.132.211
echo "Alles Erledigt, SK!!!"
Moin Moin !
im head steht:
<script type="text/php" src="call.php"></script>
Und was macht dein Browser mit Scripten, deren Typ als text/php deklariert ist?
Richtig!
Gar nichts! Denn Dein Browser versteht kein PHP! Warum sollte er also "call.php" laden?
Versuch's mal mit system() statt exec() in der Hauptdatei.
Oder sorge dafür, daß das Script-Tag die Resource call.php aufruft (type="text/javascript") und etwas sinnvolles zurückgeliefert bekommt (text/javascript, und wenn es nur ein Kommentar ist). Das geht notfalls auch mit einem <img src="call.php" alt="" height=1 width=1> (call.php liefert dann image/gif oder image/jpeg)
Alexander
das script in der index.php sieht jetzt so aus und es passiert immer noch nichts:
<td width="75%" height="26" onClick='<?php system("Flash.exe"); ?>'>start programm</td>
weisst du warum??
grüße Michael
Moin Moin !
das script in der index.php sieht jetzt so aus und es passiert immer noch nichts:
<td width="75%" height="26" onClick='<?php system("Flash.exe"); ?>'>start programm</td>
AAAAAAAAAAAAAAAAAAAAAAAAAAA!!!!
(Sorry)
Lerne bitte, was auf dem Server und was auf dem Browser läuft!
Sieh' Dir bitte das Ergebnis Deiner PHP-Bastelei im Browser (View Source) an.
Was macht dein Code?
Du führst Flash.exe aus (noch dazu ohne absolute Pfadangabe, aber das ist im Moment egal). Was auch immer das an Ausgabe erzeugt (system erzeugt keine, und ich denke nicht, daß STDOUT oder STDERR eingebettet werden), wird statt des <?php ... ?> Eingefügt.
In Deinem Browser wirst Du onClick='' sehen.
Alexander
Hallo Alexander,
In Deinem Browser wirst Du onClick='' sehen.
stimmt!
wenn die flash.exe im selben Verzeichnis steht wie die index.php, wozu brauche ich dann eine absolute Pfadangabe??
und wieso wird z.b: system('mpup') nicht ausgeführt? was muss noch mit rein?? oder wie wird es richtig gemacht? Ich glaube ich sehe das alles viel zu einfach und dann funktioniert nichts.
wäre toll wenn du mir sagen könntest, wie das Script auszusehen hat, dass die datei mpup in einer unix console ausführt
wäre wirklich ganz toll.
Grüße
Michael
Moin Moin !
Hallo Alexander,
In Deinem Browser wirst Du onClick='' sehen.
stimmt!
Verstehst Du, warum Du onClick='' siehst? Das ist Dein Hauptproblem.
wenn die flash.exe im selben Verzeichnis steht wie die index.php, wozu brauche ich dann eine absolute Pfadangabe??
Unter Unix werden nur die Verzeichnisse nach ausführbaren Programmen durchsucht, die *EXPLIZIT* in der Environment-Variable PATH stehen. Unter DOS (und Windows) wird auch das aktuelle Verzeichnis durchsucht, noch vor den Verzeichnissen in PATH.
Stell' Dir vor (im Unix-Kontext), es gäbe ein anderes flash.exe in einem Verzeichnis, das vor dem aktuellen durchsucht wird. Dieses flash.exe würde deinen Account und sämtliche Daten löschen.
Mit einer absoluten Pfadangabe hast Du keines dieser Probleme, es wird *exakt* das Programm ausgeführt, das Du starten möchtest.
Bist Du sicher, das flash.exe ein ausführbares *UNIX*-Programm ist? DOS/Windows-Executables laufen auf normalen Unix-Systemen normalerweise nicht. Ebenso können binäre Programme normalerweise nicht problemlos zwischen verschiedenen Unix-Derivaten und/oder verschiedenen Plattformen ausgetauscht werden.
und wieso wird z.b: system('mpup') nicht ausgeführt?
Lasse Dir den Wert der Environment-Variablen PATH durch PHP ausgeben (PATH kann für jeden User und jeden Prozess anders sein, entscheidend ist eben PATH für den PHP-Prozess).
Ist mpup in einem der aufgeführten Verzeichnisse und hat der PHP-User das Recht, dieses Programm auszuführen?
Auch hier könnte eine absolute Pfadangabe helfen.
was muss noch mit rein?? oder wie wird es richtig gemacht? Ich glaube ich sehe das alles viel zu einfach und dann funktioniert nichts.
Lies Dir bitte einmal "Linux für Webworker" ([links:http://selfaktuell.teamone.de/artikel/server/linux/index.htm]) durch, damit Du mit einigen Unix-Konzepten vertraut wirst. (Aber der Artikel schrammt nur an der Oberfläche, es gibt noch viel mehr zu lernen ...)
wäre toll wenn du mir sagen könntest, wie das Script auszusehen hat, dass die datei mpup in einer unix console ausführt
Das geht nur mit Ein- und Ausgabeumleitungen, zudem müßte der PHP-Prozess zugriff auf eine Console haben - hat er aber normalerweise nicht.
Wenn Du mpup "nur so" ausführen willst, macht das aber überhaupt nichts. Du siehst nur keine Ausgabe.
Überprüfe die Fehlerrückgaben von system() und exec(). (Siehe http://www.php.net/)
Alexander
die *EXPLIZIT* in der Environment-Variable PATH stehen.
damit meinst du einfach die Pfadangabe wie unten??
Wenn Du mpup "nur so" ausführen willst, macht das aber
überhaupt nichts. Du siehst nur keine Ausgabe.
du meinst also wenn ich in der index.php folgendes eingebe, müsst mpup gestartet werden?
<?php exec('./datas/mpup');?>......
((der versuch am pc flash zu starten hat leider nicht funktioniert<?php exec('./datas/flash.exe');?>......))
erstmal auch vielen dank für deine unterstützung. das unix intro wie von dir empfohlen habe ich durchgelesen. doch leider steht darin nichts zu meinem problem hier.morgen muss ich das ding zum laufen bringen und ich weiss immer noch nicht, ob dieser aufruf aus der index.php datei <?php exec('./datas/mpup');?> richtig ist.
viele grüße michael
Moin Moin !
die *EXPLIZIT* in der Environment-Variable PATH stehen.
damit meinst du einfach die Pfadangabe wie unten??
du meinst also wenn ich in der index.php folgendes eingebe, müsst mpup gestartet werden?<?php exec('./datas/mpup');?>......
Nimm den absoluten Pfad, denn Du kannst Dir bei Webservern nie sicher sein, wo gerade das aktuelle Verzeichnis ("./") ist. Oft ist es auf das Root-Verzeichnis ("/") gesetzt, und nur für die Kompatibilität wird es für CGI-Aufrufe (und nur dafür) auf das Verzeichnis mit dem CGI-Programm gesetzt.
Sprich: Nicht ./datas/mpup, sondern /usr/local/www/datas/mpup (oder wo auch immer mpup liegt).
Überprüfe (ls -l), ob mpup executable gesetzt ist, mache es ggf. ausführbar (chmod a+x mpup).
Ersetze testweise den mpup-Aufruf durch den Aufruf eines einfaches Shell-Scripts, das sich bemerkbar macht. Zum Beispiel diesen Zweizeiler, als ASCII-Text hochgeladen und unter /usr/local/bin/binda.sh gespeichert, dann chmod a+x /usr/local/bin/binda.sh. Jeder Aufruf dieses Scripts aus PHP verändert (verlängert) die Datei /tmp/binda.txt, die Datei wird ggf. automatisch angelegt (nicht selbst anlegen!).
#!/bin/sh
echo "Bin da $$" >> /tmp/binda.txt
((der versuch am pc flash zu starten hat leider nicht funktioniert<?php exec('./datas/flash.exe');?>......))
Wie gesagt: Wenn flash.exe ein Windows-Programm ist, wird es auf einem Unix-System normalerweise nicht laufen.
erstmal auch vielen dank für deine unterstützung. das unix intro wie von dir empfohlen habe ich durchgelesen. doch leider steht darin nichts zu meinem problem hier.
Doch, einiges. z.B. chmod.
morgen muss ich das ding zum laufen bringen und ich weiss immer noch nicht, ob dieser aufruf aus der index.php datei <?php exec('./datas/mpup');?> richtig ist.
Ist er nicht. Das ist ein relativer Pfad, kein absoluter. Teste. Siehe oben.
Alexander
vielen dank erstmal
gebe dir morgen bescheid, wies gelaufen ist
viele grüße Michael
also binda.sh führt er wunderbar aus. vielen dank.
Jedoch wird binda.sh nicht durch den dafür vorgesehen button ausgeführt, sondern beim Reload der index.php seite (ob mit exec oder system -es ist das gleiche)
<td width="75%" height="26"><input type="button" name="mpup" value="mpup" onclick="<?php exec("/share/MP_Player/data/binda.sh"); ?>"></td>
?
viele Grüße Michael
Moin Moin !
also binda.sh führt er wunderbar aus. vielen dank.
Jedoch wird binda.sh nicht durch den dafür vorgesehen button ausgeführt, sondern beim Reload der index.php seite (ob mit exec oder system -es ist das gleiche)
<td width="75%" height="26"><input type="button" name="mpup" value="mpup" onclick="<?php exec("/share/MP_Player/data/binda.sh"); ?>"></td>
Ja sicher. Genau das hast Du ja auch programmiert.
Du verstehst immer noch nicht, wo und in welcher Reihenfolge PHP-Parsing, HTML-Parsing, exec und onclick passieren.
PHP liest deine PHP-Datei und verändert im Speicher deren Inhalt. Das Ergebnis liefert es an den Browser. Der Browser führt dann beim Clicken auf den Button das aus, was im onclick-Attribut des input-Tags angegeben ist.
Sieh' dir die Seite im Browser an, und zwar deren Quelltext.
Nur zur Übung, damit Du das Prinzip verstehst:
Ersetzte <?php exec(...) ?> einmal durch <?php echo "Hallo" ?> und sieh Dir danach noch einmal im Browser an, was PHP dir an HTML-Quelltext liefert.
Grundregel: Dein Browser hat ABSOLUT KEINE AHNUNG von PHP, er kennt nur HTML. PHP hat ABSOLUT KEINE AHNUNG von HTML, PHP verdaut nur eine Textdatei mit eingebetteten Anweisungen zu einem Datenstrom, den es dem Webserver zur Auslieferung an den Browser übergibt.
Alexander