2011-03-14 7 views
2

Am пытается запустить приложение .mpkg из моего кода Java:Запуск .pkg на MAC OS от кода

 
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(); 
     } 
    } 

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

[email protected] 
Password: 
Sumit-Ghoshs-iMac-3:downloads sumitghosh3$ Password: 
Password: 
-bash: **********: command not found 

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

ответ

1

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

sumitghosh3 ALL=(ALL) NOPASSWD: ALL 
2

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

echo "[email protected]" | sudo -S cal -y 2011 

Команда выше беги «кал -y 2011» с корневыми разрешениями.

0

Если вы хотите получить интерактивное решение для повышения привилегий, я использовал 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 флага верно, диалоговое окно пароля будет поднято. Не показан createTmpScript(), который создает исполняемый файл в /tmp и StreamReader, который расширяет Thread и используется для захвата потоков stdout и stderr.

Смежные вопросы