2015-05-25 38 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

感谢大家的回答,我能够成功执行它。 –