我正在尝试在Java中执行此命令,我需要获取输出
在java字符串中。该命令使用密码短语加密纯文本,然后返回加密的纯文本。
命令是:
/ bin / sh -c回显“ textToEncrypt” | / usr / bin / openssl enc -aes-256-cbc -e -base64 -A -pass pass:passwordPhrase
我执行以下操作:
我可以在linux shell中运行该命令,然后在shell中获得一个加密的输出字符串,例如:“ U2FsdGVkX1 / 1UcPzhX7IGgvXdx9YrS + cizrla8UYhU8 =”,因此该命令有效。
我可以在Java 1.7中运行相同的命令,例如下面的示例代码(cryptData方法)。它运行正常,但是我没有输出(加密数据)。
我可以从Java运行任何不带“ echo”的命令,例如,(“ ls -fla | more”)。再次运行正常,我总是得到输出。
这是代码:
public void cryptData() {
String passwordPhrase="a1b2c3d4e5";
ProcessBuilder processBuilder = new ProcessBuilder();
List<String> commands = new ArrayList<String>();
commands.add("/bin/sh");
commands.add("-c");
commands.add("echo");
commands.add("/"textToCrypt/"");
commands.add("|");
commands.add("/usr/bin/openssl");
commands.add("-aes-256-cbc");
commands.add("-e");
commands.add("-base64");
commands.add("-A");
commands.add("-pass");
commands.add("pass:"+passwordPhrase);
// Run the shell command
processBuilder.command(commands);
try { //standard stringBuilder process
Process process = processBuilder.start();
StringBuilder output = new StringBuilder();
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
}
int exitVal = process.waitFor();
if (exitVal == 0) {
System.out.println("Success!");
System.out.println("Output1"+ output);
System.out.println("Output2"+ output.toString());
System.exit(0);
} else {
System.out.println("Error");
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
最终结果始终是:“成功!”但此代码的输出为空或为null。我在做什么错了?
答案 0 :(得分:0)
sh -c
期望命令作为单个参数执行。因此,在添加/bin/sh
和-c
之后,您应该将命令的其余部分作为单个参数添加,如下所示:
commands.add("/bin/sh");
commands.add("-c");
commands.add("echo /" + textToCrypt + "/ | /usr/bin/openssl -aes-256-cbc " +
"-e -base64 -A -pass pass: " + passwordPhrase);