Выполнить сценарий оболочки из Java - PullRequest
0 голосов
/ 26 января 2019

Я хочу выполнить скрипт оболочки из Java.У меня есть следующий код

    ProcessBuilder pb2 = null;
    if (this.args.size() == 0) {
        pb2 = new ProcessBuilder(file.getPath());
    } else if (this.args.size() > 0) {
        pb2 = new ProcessBuilder(file.getPath(), this.args.get(0));
    }

    Process p2;
        p2 = pb2.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p2.getInputStream()));
        String line = null;
        while ((line = reader.readLine()) != null) {
            log(line);
                }

Но я получаю Permission denied.Я попытался выполнить файл с sh в начале, но код не работает.

       ProcessBuilder pb2 = null;
    if (this.args.size() == 0) {
        pb2 = new ProcessBuilder("sh", file.getPath());
    } else if (this.args.size() > 0) {
        pb2 = new ProcessBuilder("sh", file.getPath(), this.args.get(0));
    }

    Process p2;
        p2 = pb2.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p2.getInputStream()));
        String line = null;
        while ((line = reader.readLine()) != null) {
            log(line);
                }

Я мог бы дать ему разрешение с chmod a+x, но идея в том, чтобы сделать это автоматически.

Обновление: я попробовал первый код с file.setExecutable(true), но ничего не происходит, я не получаю Permission Denied, но файл не выполняется

1 Ответ

0 голосов
/ 26 января 2019

Если вы хотите выполнить файл как сценарий оболочки, он должен иметь установленные разрешения на выполнение. Обойти это невозможно.

Если вы создаете файл сценария из своего приложения Java, тогда ваше приложение может изменить права доступа к файлу после того, как оно создаст файл.

Если какой-то пользователь загружает этот скрипт, тогда вам нужно быть действительно, действительно уверенным, что вы доверяете пользователю. Есть множество неприятных вещей, которые могут случиться, если вы примете скрипт оболочки от кого-то, кто не заслуживает доверия. (Это включает в себя последствия невинных, но опасных ошибок.)


Обновление: я попробовал первый код с file.setExecutable(true), но ничего не происходит, я не получаю разрешение, но файл не выполняется.

Что-то случилось. У вас остановлено получение сообщения об отказе в разрешении!

Следующим шагом будет отладка сценария, который вы генерируете / выполняете:

  • Глазное яблоко это. Проверьте правильность строки "hash bang". Ищите другие ошибки.

  • Извлеките stdout и stderr из сценария и проверьте ошибки.

  • Добавьте несколько «отпечатков трассировки» в скрипт; например,

        echo "here 1" >> /tmp/log
    
  • Ожидает ли дочерний процесс ввода от родительского процесса Java?

  • Читаете ли вы стандартный вывод и стандартную ошибку ребенка в родительском процессе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...