Heim >Backend-Entwicklung >PHP-Tutorial >Python – PHP ruft Shell-Befehl auf: exec('java -jar a.jar') wird nicht ausgeführt.
Verwenden Sie die Funktion exec
von PHP, um shell
auszuführen. Viele Befehle können ausgeführt werden, es gibt jedoch ein Problem beim Ausführen von Java-Programmen.
[testshell.php] lautet wie folgt:
<code><?php $str="java -jar a.jar"; exec($str,$output,$retnruVal); print_r($output); ?></code>
Die Java-Datei ist ebenfalls sehr einfach. Es handelt sich um eine Testdatei, die helloworld ausgibt und in die Datei schreibt.
Außerdem verwende ich php
, um diese Datei wie folgt direkt auszuführen, und es gelingt ohne Probleme:
<code>$ php testshell.php</code>
Aber wenn ich diese PHP-Datei im Browser ausführe, erfolgt keine Antwort.
Zuerst vermutete ich, dass es sich um ein Problem mit der Schreibberechtigung handelte, aber ich schrieb einen weiteren python
Test:
<code>file("output.txt").write("测试\n")</code>
Dann wird testshell.php geändert in:
<code>$str="python a.py"; exec($str,$output,$retnruVal); print_r($output);</code>
Das ist auch erfolgreich, daher weiß ich nicht, wo das Problem liegt – bitte geben Sie mir einen Rat.
Anbei ist das Programm a.java:
<code>import java.io.File; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileWriter; public class a{ public static void main (String[] args) { try{ File writename = new File("output.txt"); // 相对路径,如果没有则要建立一个新的output。txt文件 writename.createNewFile(); // 创建新文件 BufferedWriter out = new BufferedWriter(new FileWriter(writename)); out.write("我会写入文件啦\r\n"); // \r\n即为换行 out.flush(); // 把缓存区内容压入文件 out.close(); // 最后记得关闭文件 }catch(Exception e){ e.printStackTrace(); } } }</code>
hat a.java
geändert und eine Ausgabe hinzugefügt. Das bedeutet, dass System.out.println
ausgeführt werden kann, der nachfolgende Code jedoch nicht ausgeführt werden kann. Es scheint kein Berechtigungsproblem zu sein.
<code>public static void main (String[] args) { try{ String a = "hello"; System.out.println(a); File writename = new File("output.txt"); // 相对路径,如果没有则要建立一个新的output。txt文件 writename.createNewFile(); // 创建新文件 BufferedWriter out = new BufferedWriter(new FileWriter(writename)); out.write("我会写入文件啦\r\n"); // \r\n即为换行 out.flush(); // 把缓存区内容压入文件 out.close(); // 最后记得关闭文件 }catch(Exception e){ e.printStackTrace(); } }</code>
Verwenden Sie die PHP-Funktion exec
, um shell
auszuführen. Viele Befehle können ausgeführt werden, es gibt jedoch ein Problem beim Ausführen von Java-Programmen.
[testshell.php] lautet wie folgt:
<code><?php $str="java -jar a.jar"; exec($str,$output,$retnruVal); print_r($output); ?></code>
Die Java-Datei ist auch sehr einfach. Es handelt sich um eine Testdatei, die helloworld ausgibt und in die Datei schreibt.
Außerdem verwende ich php
, um diese Datei wie folgt direkt auszuführen, und es gelingt ohne Probleme:
<code>$ php testshell.php</code>
Aber wenn ich diese PHP-Datei im Browser ausführe, erfolgt keine Antwort.
Zuerst vermutete ich, dass es sich um ein Problem mit der Schreibberechtigung handelte, aber ich schrieb einen weiteren python
Test:
<code>file("output.txt").write("测试\n")</code>
Dann wird testshell.php geändert in:
<code>$str="python a.py"; exec($str,$output,$retnruVal); print_r($output);</code>
Das ist auch erfolgreich, daher weiß ich nicht, wo das Problem liegt – bitte geben Sie mir einen Rat.
Anbei ist das Programm a.java:
<code>import java.io.File; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileWriter; public class a{ public static void main (String[] args) { try{ File writename = new File("output.txt"); // 相对路径,如果没有则要建立一个新的output。txt文件 writename.createNewFile(); // 创建新文件 BufferedWriter out = new BufferedWriter(new FileWriter(writename)); out.write("我会写入文件啦\r\n"); // \r\n即为换行 out.flush(); // 把缓存区内容压入文件 out.close(); // 最后记得关闭文件 }catch(Exception e){ e.printStackTrace(); } } }</code>
hat a.java
geändert und eine Ausgabe hinzugefügt. Das bedeutet, dass System.out.println
ausgeführt werden kann, der nachfolgende Code jedoch nicht ausgeführt werden kann. Es scheint kein Berechtigungsproblem zu sein.
<code>public static void main (String[] args) { try{ String a = "hello"; System.out.println(a); File writename = new File("output.txt"); // 相对路径,如果没有则要建立一个新的output。txt文件 writename.createNewFile(); // 创建新文件 BufferedWriter out = new BufferedWriter(new FileWriter(writename)); out.write("我会写入文件啦\r\n"); // \r\n即为换行 out.flush(); // 把缓存区内容压入文件 out.close(); // 最后记得关闭文件 }catch(Exception e){ e.printStackTrace(); } }</code>
Ich weiß nicht, ob es spezifische Rückgabeinformationen gibt, aber meiner Schlussfolgerung nach hat es etwas mit dem Dateipfad zu tun.
Sind die Umgebungsvariablen von Java korrekt? Versuchen Sie es mit dem vollständigen Java-Pfad auszuführen.
Gelöst. Berechtigungsproblem. www-data ist der Standardbenutzer ohne Schreibberechtigung für Dateien. . . Ausgetrickst