2015-05-25 89 views
1

我在使用Ubuntu環境中的jar執行openSSL命令時遇到問題。 我已經得出結論,這是因爲在命令中作爲參數傳遞的文件路徑中的空間而發生的,例如, SHA 256在下面的命令。 我已經使用過程和ProcessBuilder類,用於執行相同的:ProcessBuilder並運行包含空格的OpenSSL命令

首先

String certFilePath = "/home/mplusuer/Desktop/Nishant/210515/TestData/TestData/SHA 256/nishant.cer" 
String []cmdGetAlgorithm = new String[3]; 

cmdGetAlgorithm[0] = "openssl x509 -in"; 
cmdGetAlgorithm[1] = certFilePath; 
cmdGetAlgorithm[2] = "-noout -text -certopt no_subject,no_header,no_version,no_serial,no_validity,no_subject,no_issuer,no_pubkey,no_sigdump,no_aux,no_extensions"; 

ProcessBuilder pb = new ProcessBuilder(cmdGetAlgorithm[0], cmdGetAlgorithm[1],cmdGetAlgorithm[2]); 
// setup other options ... 

Process processGetAlgorithm = pb.start(); 
processGetAlgorithm.waitFor(); 

Runtime runtime = Runtime.getRuntime(); 
String cmdGetAlgorithm = "openssl x509 -in " 
     + certFilePAth 
     + " -noout -text -certopt no_subject,no_header,no_version,no_serial,no_validity,no_subject,no_issuer,no_pubkey,no_sigdump,no_aux,no_extensions "; 

Process processGetAlgorithm = runtime.exec(cmdGetAlgorithm); 

最終命令如下,如果單獨執行,它工作正常在命令提示符處,但無法使用Java代碼執行時:

openssl x509 -in /home/mplusuer/Desktop/Nishant/210515/TestData/TestData/SHA 256/suketu.cer \ 
    -noout -text -certopt no_subject,no_header,no_version,no_serial,no_validity,no_subject, \ 
    no_issuer,no_pubkey,no_sigdump,no_aux,no_extensions 

我用下面的方法也爲解決這個問題,但沒有什麼工作按預期:

String quoted = "\"" + certFilePath + "\""; 
String escaped = certFilePath.replace(" ", "\\ "); 

請看到它,並幫助我解決這個問題。

+0

1)會發生什麼? – immibis

+0

請在以下錯誤中找到以下錯誤:1)java.io.IOException:無法運行程序「openssl x509 -in」:error = 2,沒有這樣的文件或目錄 \t at java.lang.ProcessBuilder.start(ProcessBuilder.java :1047) –

+1

你有一個叫做'openssl x509 -in'的程序嗎?如果沒有,那麼你爲什麼要運行一個名爲'openssl x509 -in'的程序? (與前兩個參數爲'x509'和'-in'運行名爲'openssl'的程序相反) – immibis

回答

0
cmdGetAlgorithm[0] = "openssl x509 -in"; 
... 

正如評論指出@immibis,arg[0]是程序名稱。因此,向量應該是這個樣子:

cmdArg[0] = "/usr/local/ssl/bin/openssl"; 
cmdArg[1] = "x509"; 
cmdArg[2] = "-in"; 
cmdArg[3] = certFilePAth; 
cmdArg[4] = "-noout" 
cmdArg[5] = "-text"; 
cmdArg[6] = "-certopt"; 
cmdArg[7] = "no_subject,no_header,no_version,no_serial,no_validity," + 
      "no_issuer,no_pubkey,no_sigdump,no_aux,no_extensions "; 

你應該總是指定可執行文件的完整的文件名,以確保您正在運行預期的可執行文件,而不是被對手種植。

+0

感謝大家的回答,我能夠成功執行它。 –

相關問題