2014-06-16 103 views
0

我在我的程序中通過Runtime.getRuntime().exec()自動創建了一個通過keytool的SSL證書,它在Windows上工作正常。exec()不能在Debian 7上工作

當我嘗試在Debian 7上運行我的代碼時,它只是不執行該命令。那麼,它確實執行,但它返回錯誤代碼1,這基本上意味着出了問題。

如果我讓我的程序打印要執行的字符串,然後手動執行此命令,那麼一切工作正常。

這裏的一些調試輸出碼:

private static void initKeystore() 
{ 
    Scanner scr = new Scanner(System.in); 
    System.out.println("**** IMPORTANT ****"); 
    System.out.println("You don't have a certificate for using SSL yet."); 
    System.out.println("We will create it together now!"); 
    System.out.println(); 
    System.out.print("Name of your organisation: "); 
    String ssl_o = scr.nextLine(); 
    String ssl_ou = ssl_o; 
    System.out.print("Your name: "); 
    String ssl_cn = scr.nextLine(); 
    System.out.print("Country code [de/en/fr]: "); 
    String ssl_c = scr.nextLine(); 
    System.out.print("City: "); 
    String ssl_l = scr.nextLine(); 
    System.out.print("State: "); 
    String ssl_st = scr.nextLine(); 
    System.out.print("Password: "); 
    String pass = new String(scr.nextLine()); 

    String execString = "keytool -genkey -keyalg RSA -alias dreamim -keystore " + KEYSTORE + " -storepass " + pass + " -validity 360 -dname \"cn=" + ssl_cn + ", o=" + ssl_o + ", ou=" + ssl_ou + ", c=" + ssl_c + ", l=" + ssl_l + ", st=" + ssl_st + "\" -keypass " + pass; 
    System.out.println(execString); 
    try 
    { 
     Process proc = Runtime.getRuntime().exec(execString); 

     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
     String line; 
     while ((line = bufferedReader.readLine()) != null) 
     { 
      System.out.println(line); 
     } 
     bufferedReader.close(); 

     proc.waitFor(); 
     System.out.println("Key generation exited with code: " + proc.exitValue()); 

     execString = "keytool -export -keystore " + KEYSTORE + " -storepass " + pass + " -alias dreamim -file DreamIM.crt"; 
     proc = Runtime.getRuntime().exec(execString); 
     proc.waitFor(); 

    } 
    catch (Exception e) 
    { 
      // TODO: Improve exception handling 
     e.printStackTrace(); 
    } 

    scr.close(); 
} 

我的代碼沒有拋出任何異常...... 是否與exec()和Debian 7(OpenJDK的)任何已知的兼容性問題嗎?

+0

「* exec()和Debian 7(OpenJDK)是否存在任何已知的兼容性問題?*」=>否。顯示你的代碼。 – assylias

+0

'keytool'可以關於參數的順序。你需要顯示一些代碼。 – jww

+0

我編輯了問題並添加了一些代碼。我敢肯定,這不是參數的順序,因爲正如我在我的問題中所說的那樣,當我手動執行keytool命令時,一切正常,在Windows中它也可以自動運行此代碼。這只是Linux不起作用的地方。 – MrPixelDream

回答

0

我終於設法解決了這個問題。這和我想的一樣簡單。我只是使用exec(String [])方法並手動提供參數。 我想這是像-dname選項沒有正確轉義,Windows忽略或自動更正它。