对于chmod命令,Java中的权限被拒绝错误

时间:2010-06-21 15:15:13

标签: java permissions

我有一个可执行文件(ffmpeg),我正在尝试使用Mac上的Java程序运行。我使用Java程序发送命令chmod 777 /path/to/ffmpeg,但是当我尝试运行ffmpeg时,我收到以下错误:

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

但是当我在打开Java应用程序之前自己从Terminal运行chmod 777 /path/to/ffmpeg时,ffmpeg的命令在Java程序中运行得很好。

在Java程序中调用chmod并自己调用它是否有区别?为什么它不起作用?谢谢!

6 个答案:

答案 0 :(得分:6)

我的代码中遇到了同样的问题。 我通过在exec之后添加waitFor来解决这个问题。执行下一个命令时,“chmod”进程未完成。代码可能如下所示:

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

答案 1 :(得分:4)

是的,有区别。从终端运行命令时,您正在执行操作,因此使用您的凭据执行该操作。 Java应用程序使用Java应用程序的权限运行该命令。这是为了防止应用程序运行,然后对文件系统进行危险的,不需要的更改。也许其他人可以为此解决方法并为其提供指导。

答案 2 :(得分:4)

我猜测chmod是一个shell命令,而不是一个可执行文件。尝试通过shell运行chmod。在此处查看更多详细信息:Want to invoke a linux shell command from Java

答案 3 :(得分:2)

我目前正在开发一个也在OSX上使用FFMpeg的项目。我将FFMpeg存储在JAR中并提取它并在使用时设置可执行文件,就像您似乎正在做的那样。这就是我的工作,似乎有效。

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
}

代码是GPL,所以请随时查看。它不是最好的代码库,甚至FFMpeg的东西也许过于复杂,但它确实有效。

可在http://korsakow.net

查看来源

这两个文件特别适合您

FFMpegEncoderOSX.java

FileUtil.java

答案 4 :(得分:1)

试试这个:

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

答案 5 :(得分:0)

要在OSX上启动程序,您需要这样做:

    public class Booking
    {
        public int BookingId { get; set; }                                                                                                                      
        public DateTime Arrival { get; set; }
        public DateTime Departure { get; set; }
        public virtual Guest MainGuest { get; set; }
    }

    public class Guest
    {
        public int GuestId { get; set; }
        public string Name { get; set; }
        public string FirstName { get; set; }
    }

    using(var context = new HotelContext())
    {
        var cBookings = context.Bookings.Where(b => b.MainGuest != null);

        foreach (var cBooking in cBookings)
        {
            // Since EF 6.4.4
            // MySqlException: There is already an open DataReader associated with this Connection which must be closed first.
            Console.WriteLine(cBooking.MainGuest.Name);                     
        }
    }

path应该是程序摘录的路径,例如:

AppStore->应用程序/ App \ Store.app/Contents/MacOS/App \ Store