2012-06-14 2 views
5

Моя программа работает на Ubuntu 10.04, а вот код:Java Runtime Exec не проливает такого файла или разрешение Отказано

Process process=Runtime.getRuntime().exec("ls",null,null); 

он сгенерирует исключение:

Cannot run program "ls": java.io.IOException: error=2, No such file or directory, 

и я попытался чтобы изменить «ls» на «chmod», «pwd», я не нашел ни одной команды оболочки, все пошло на ту же проблему. (Я также попытался «/ bin/sh -c ls»)

, а затем i измените код на:

Process process=Runtime.getRuntime().exec("/bin/ls",null,null); 

он сгенерирует исключение:

Cannot run program "/bin/ls": java.io.IOException: error=13, Permission denied 

Я изменил привилегии всех связанных файлов и каталогов до 777, так что я действительно не знаю, что случилось с ним.

Благодарим за ответы.

ответ

2
Process process=Runtime.getRuntime().exec("ls",null,null); 

Это, как ожидается, дать No such file or directory исключение, поскольку ls, скорее всего, не в текущей рабочей директории программы. Когда вы вводите ls из командной строки оболочки Linux, он использует переменную окружения PATH, чтобы превратить ls в /bin/ls. Runtime не делает этого для вас.

Необходимо указать полный путь "/bin/ls". Как упоминал @Ernest, вы должны использовать метод Runtime.exec("/bin/ls") и не передавать нулевые аргументы.

Process process=Runtime.getRuntime().exec("/bin/ls"); 

Ваши комментарии, кажется, показывают, что даже при использовании этого вызова, вы получаете Permission denied исключение. Это работает для меня со стандартного исполняемого файла Java. Я предполагаю, что вы можете сделать /bin/ls из командной строки Linux успешно? /bin/ls (и связанные каталоги) должны быть 755 и не 777, который был бы кошмаром безопасности. Но 777 должен работать.

Возможно, у вас есть какой-то защищенный JDK? Например, у апплетов нет прав на выполнение команд Unix по соображениям безопасности. Возможно, у вас есть ограничивающий Java policy file, и вам нужно добавить разрешения execute?

+0

Спасибо за ваш ответ, я нахожу, что причина в том, что мой встроенный компилятор eclipse не является стандартным sun-jdk, он открыт jdk, теперь я использую ant для компилятора моей программы с sun-jdk-javac, все в порядке, Спасибо большое. – libing