ProcessBuilder 和 运行 包含空格的 OpenSSL 命令
ProcessBuilder and running OpenSSL command which contains spaces
我在 Ubuntu 环境中使用我的 jar 执行 openSSL 命令时遇到问题。
我得出的结论是,这是因为文件路径中的 space 正在作为命令中的参数传递,例如SHA 256 在下面的命令中。
我同时使用了进程和 ProcessBuilder
类 来执行相同的操作:
第一:
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(" ", "\ ");
请注意并帮助我解决。
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 ";
您应该始终指定可执行文件的完整文件名,以确保您是 运行 预期的可执行文件,而不是对手植入的东西。
我在 Ubuntu 环境中使用我的 jar 执行 openSSL 命令时遇到问题。
我得出的结论是,这是因为文件路径中的 space 正在作为命令中的参数传递,例如SHA 256 在下面的命令中。
我同时使用了进程和 ProcessBuilder
类 来执行相同的操作:
第一:
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(" ", "\ ");
请注意并帮助我解决。
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 ";
您应该始终指定可执行文件的完整文件名,以确保您是 运行 预期的可执行文件,而不是对手植入的东西。