2010-06-21 6 views
11

Ich habe eine ausführbare Datei (ffmpeg), die ich versuche, mit einem Java-Programm auf einem Mac auszuführen. Ich benutzen das Java-Programm den Befehl chmod 777 /path/to/ffmpeg zu senden, aber wenn ich versuche, ffmpeg zu laufen, ich folgende Fehlermeldung erhalten:Berechtigung verweigert Fehler in Java für chmod Befehl

java.io.IOException: Cannot run program "/Users/james/WalkTheHall/ffmpeg": error=13, Permission denied 

Aber wenn ich laufe chmod 777 /path/to/ffmpeg vom Terminal auf meinem eigenen, bevor die Java-Anwendung zu öffnen, den Befehl zu ffmpeg wird in dem Java-Programm problemlos ausgeführt.

Gibt es einen Unterschied zwischen dem Aufruf von chmod aus dem Java-Programm und dem Aufruf von mir selbst? Warum wird es nicht funktionieren? Vielen Dank!

+0

vielleicht sind Sie mit der ausführbaren Java-Datei mit einem Benutzer, der die Privilegien, die Datei chmod nicht hat –

+0

Details ... I don Ich weiß nicht auf Mac, aber auf GNU/Linux als gewöhnlicher Benutzer konnte man 'chmod 777' nicht machen (einige Berechtigungen sind" maskiert "), also ist es möglich, wenn man vom Terminal aus versucht, dass man tatsächlich die Art von Benutzer ist so etwas, während Sie das Java als Benutzer ausführen, der nicht kann? (Es ist auch möglich, dass der Java-vm Privilegien bei der Ausführung als "Power" -Benutzer löscht, nur um die Sicherheit zu erhöhen) – ShinTakezou

Antwort

4

Ich würde vermuten, dass chmod ist ein Shell-Befehl, keine ausführbare Datei. Versuchen Sie, chmod durch Ihre Shell auszuführen. Sehen Sie mehr Details hier: Want to invoke a linux shell command from Java

+0

Vielen Dank Carl, es hat perfekt funktioniert, um es mit bash! –

+0

'was chmod' sagt '/ bin/chmod' für mich so unter Bash-3.2.48 es ist eine ausführbare Datei und keine eingebaute Shell. Vielleicht was auch immer startet Java hat es nicht im ausführbaren Suchpfad, aber das Aufrufen der Shell führt die Shell-Konfigurations-Skripte des Benutzers aus, die PATH reparieren. –

4

Ja, es gibt einen Unterschied. Wenn Sie den Befehl vom Terminal ausführen, sind Sie es, der die Aktion ausführt, und somit wird er mit Ihren Anmeldeinformationen ausgeführt. Die Java-Anwendung führt den Befehl mit den Berechtigungen der Java-Anwendung aus. Dies soll verhindern, dass eine Anwendung ausgeführt wird, und dann gefährliche, unerwünschte Änderungen am Dateisystem vornehmen. Vielleicht kann jemand anderes einen Workaround dafür erarbeiten und Anleitung geben.

+0

Danke Ryan! Sicherlich gibt es eine Möglichkeit, das Programm innerhalb von Java auszuführen. Irgendwelche Ideen, was zu tun ist? –

+0

Nicht sicher. Es scheint so, als ob dies nicht vom Design erlaubt sein sollte, wie ShinTakezous Kommentar zu Ihrer Frage aus Sicherheitsgründen sagt. Hast du CarlGs Antwort versucht? Wenn es unter Linux funktioniert, wäre es auf jeden Fall einen Versuch auf Mac OS wert. –

2

Ich arbeite zZ an einem Projekt, das auch FFMpeg auf OSX verwendet. Ich speichere FFMpeg in der JAR und entpacke es und setze die ausführbare Datei so, wie es scheint. Das ist was ich tue und es scheint zu funktionieren.

 
public static void setExecutable(File file, boolean executable) 
{ 
    Process p = Runtime.getRuntime().exec(new String[] { 
     "chmod", 
     "u"+(executable?'+':'-')+"x", 
     file.getAbsolutePath(), 
    }); 
    // do stuff to make sure p finishes & capture output 
} 

Der Code ist GPL, also fühlen Sie sich frei, es auszuprobieren. Es ist nicht die schönste Codebase und sogar das FFMpeg-Zeug ist vielleicht zu komplex, aber es funktioniert.

Quelle ist bei http://korsakow.net

interessant Diese beiden Dateien insbesondere sichtbar sein könnten Sie für

FFMpegEncoderOSX.java

FileUtil.java

+0

Danke für die Antwort, ich schätze es! Ich führe diesen Befehl aus, aber es gibt immer noch eine Erlaubnis verweigert Fehler. Irgendwelche Ideen warum? –

5

Ich hatte gerade das gleiche Problem in meinem Code. Ich löste dies durch Hinzufügen von waitFor nach exec. Der "chmod" -Prozess ist nicht beendet, wenn der nächste Befehl ausgeführt wird. der Code aussehen kann:

p = Runtime.getRuntime.exec("chmod 777 xxx"); 
p.waitFor(); 
Runtime.getRuntime.exec("./xxx"); 
1

Versuchen Sie folgendes:

commandFile.setExecutable(true); 
Process p = Runtime.getRuntime.exec(commandFile.getAbsoluteFile()); 
Verwandte Themen