【发布时间】:2019-05-09 15:02:48
【问题描述】:
我试图在java中执行这个命令,我需要得到输出
在 java 字符串中。该命令使用密码短语加密纯文本并返回加密的纯文本。
命令是:
/bin/sh -c echo "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();
}
}
最终的结果永远是:“成功!”但是此代码的输出为空或为空。我做错了什么?
【问题讨论】:
-
可能是因为您将“passwordPhrase”作为字符串而不是变量passwordPhrase 的值传递?
-
我不这么认为,因为格式是 pass:passphrase,而值或“passwordPhase”也可以同时使用。我认为问题不在于命令本身,而在于如何获取执行命令的输出,但我不知道。我用图像截图更新了这个问题。谢谢。
-
为什么您的屏幕截图会在假设的命令输出之前显示 shell 提示?看起来该命令不起作用,看起来您将预期的输出与命令一起粘贴了。
-
@sepp2k 是的,你是对的。我使用在线免费外壳,我编辑了图像。我只是想证明它有效link
-
@OscarP 但它不起作用。
sh -c echo "textToEncrypt"将打印一个空行,并将其通过管道传输到openssl。所以它将编码一个空行,而不是“textToEncrypt”。
标签: java linux stream stringbuilder processbuilder