Запуск .pkg на MAC OS из кода Java - PullRequest
2 голосов
/ 14 марта 2011

Я пытаюсь запустить приложение .mpkg из моего кода Java:

public void runNewPkg(){

try {

           String command = "sudo installer -pkg Snip.mpkg -target /Applications";
            Process p = Runtime.getRuntime().exec(command);
            System.out.println(p.getErrorStream());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

И получаю следующую ошибку, и окно моего терминала зависает ..

java.lang.UNIXProcess$DeferredCloseInputStream@2747ee05
Password:
Sumit-Ghoshs-iMac-3:downloads sumitghosh3$ Password:
Password:
-bash: **********: command not found

Sumit-Ghoshs-iMac-3:downloads sumitghosh3$
  • Я думаю, что мне нужно предоставить пароль также для запуска pkg из командной строки. Не могли бы вы сказать мне, как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 14 марта 2011

Вы можете указать пароль для sudo:

echo "p@sw0rd" | sudo -S cal -y 2011

Приведенная выше команда запускает cal -y 2011 с правами root.

1 голос
/ 14 марта 2011

Я бы попытался отредактировать файл / etc / sudoers, чтобы не запрашивать пароль. Если вы используете тег NOPASSWD, вы сможете это сделать. Пример записи будет:

sumitghosh3 ALL=(ALL) NOPASSWD: ALL
0 голосов
/ 06 марта 2012

Если вам нужно интерактивное решение для повышения привилегий, я использовал openscript, чтобы повысить привилегии сценария оболочки.Это выглядит примерно так:

import java.io.File;
import java.text.MessageFormat;

/**
 * OsxExecutor.java
 */
public class OsxExecutor {

    private String error = null;
    private String output = null;

    /**
     * Privileged script template format string.
     * Format Arguments:
     * <ul>
     * <li> 0 = command
     * <li> 1 = optional with clause
     * </ul>
     */
    private final static String APPLESCRIPT_TEMPLATE = 
        "osascript -e ''try''"
        + " -e ''do shell script \"{0}\" {1}''" 
        + " -e ''return \"Success\"''" 
        + " -e ''on error the error_message number the error_number'' "
        + " -e ''return \"Error: \" & error_message''"
        + " -e ''end try'';";


    public void executeCommand(String command, boolean withPriviledge) {
        String script = MessageFormat.format(APPLESCRIPT_TEMPLATE,
                                             command,
                                             withPriviledge
                                              ?  "with administrator privileges"
                                               : "");
        File scriptFile = null;
        try {
            scriptFile = createTmpScript(script);
            if (scriptFile == null) {
                return;
            }
            // run script
            Process p = Runtime.getRuntime().exec(scriptFile.getAbsolutePath());

            StreamReader outputReader = new StreamReader(p.getInputStream());
            outputReader.start();
            StreamReader errorReader = new StreamReader(p.getErrorStream());
            errorReader.start();

            int result = p.waitFor();

            this.output = outputReader.getString();
            if (result != 0) {
                this.error = "Unable to run script " 
                    + (withPriviledge ? "with administrator privileges" : "") 
                    + "\n" + script + "\n"
                        + "Failed with exit code: " + result
                        + "\nError output: " + errorReader.getString();
                return;
            }
        } catch (Throwable e) {
            this.error = "Unable to run script:\n" + script
                    + "\nScript execution "
                    + (withPriviledge ? " with administrator privileges" : "") 
                    + " failed: " + e.getMessage();
        } finally {
            if (scriptFile.exists()) {
                scriptFile.delete();
            }
        }
    }
}

Если флаг withPriviledge установлен в true, появится диалоговое окно с паролем.Не показаны createTmpScript(), который создает исполняемый файл в /tmp, и StreamReader, который расширяет Thread и используется для захвата потоков stdout и stderr.

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