Java - Отказано в доступе при попытке выполнить скрипт оболочки - PullRequest
0 голосов
/ 01 сентября 2018

Я создаю программу Java, которая выполнит файл JAR для локального развертывания базы данных на моем компьютере. Для этого мне нужно выполнить JAR-файл из сценария оболочки (это нужно автоматизировать, а не развертывать вручную).

"java -jar some-jar-SNAPSHOT.jar"

Проблема в том, что я получаю ошибку = 13, в разрешении отказано всякий раз, когда я пытаюсь получить доступ к сценарию оболочки любого типа. Я использовал sudo chmod 777, чтобы мои каталоги читались, записывались, выполнялись для всех пользователей, а также сам файл JAR. Проблема возникает, даже когда я пытаюсь изменить каталоги.

Вот фрагмент кода, который я использую для выполнения команды:

String[] jarCommand = {"java -jar some-jar-SNAPSHOT.jar"}; Process process = Runtime.getRuntime().exec(jarCommand); System.out.println("Jar File accessed");

Редактировать: эта проблема с разрешениями возникает, когда я пытаюсь выполнить простую команду, например:

String[] cd = {jarDirectory.getAbsolutePath(), "cd"}; Runtime.getRuntime().exec(cd);

Это после установки прав доступа к файлу через chmod.

Я посмотрел на кучу разных похожих вопросов, и ни одно из решений не решило мою проблему. Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Речь идет не о разрешениях на выполнение файла JAR. На самом деле, файл JAR должен быть только для чтения.

Если заголовок вашего вопроса является точным, речь идет о том, может ли программа на Java прочитать и выполнить сценарии оболочки , о которых вы говорите:

  • Сами сценарии оболочки должны выполняться исполняемым пользователем, который пытается их запустить. Например, в самих сценариях должны быть установлены соответствующие биты выполнения.

  • Пути к сценариям оболочки должны быть доступны для чтения (действующему пользователю ...) на всем пути от корневого каталога. (Или текущий каталог, если вы используете относительный путь относительно точки. Или каталоги $ PATH ..., если вы используете простое имя команды.)


Странно то, что фрагмент кода НЕ является попыткой запустить скрипт оболочки вообще. Это простая команда java. Сценарии оболочки не используются.

Если это не удается из-за ошибки «В доступе отказано», либо команда java не является исполняемой, либо файл JAR недоступен для чтения.

Я думаю, вы должны предоставить нам больше информации; например все соответствующие выходные данные, реальный код и реальные имена файлов и каталогов и разрешения.


Моя программа начинается с простой попытки перейти (через CD) к каталогу, в котором находится сам файл JAR:

Я предполагаю, что вы понимаете, что ваша попытка:

    String[] cd = {jarDirectory.getAbsolutePath(), "cd"};
    Runtime.getRuntime().exec(cd);

не работает. Он изменяет текущий каталог дочернего процесса, но это не влияет на родительский или следующий дочерний процесс, который вы запускаете. Вы должны использовать ProcessBuilder и, в частности, его directory(File), который можно использовать для выбора другого текущего каталога для дочернего процесса.

Это означает, что вы, вероятно, находитесь не в том каталоге, что может привести к проблеме «отказано в разрешении».

0 голосов
/ 02 сентября 2018

Я не знаю, почему это приведет к отказу в разрешении, но это должно быть

String[] jarCommand = {"java", "-jar", "some-jar-SNAPSHOT.jar"};

В противном случае вызов exec будет искать исполняемый файл с именем "java -jar some-jar-SNAPSHOT.jar", хотя я ожидаю, что результатом будет ENOENT, а не EPERM.

...