【问题标题】:StringBuilder output is empty executing linux echo command执行 linux echo 命令时,StringBuilder 输出为空
【发布时间】: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


截图:

我执行以下操作:

  1. 我可以在 linux shell 中运行该命令,并在 shell 中得到一个加密的输出字符串,例如:“U2FsdGVkX1/1UcPzhX7IGgvXdx9YrS+cizrla8UYhU8=”,因此该命令有效。

  2. 我可以在 java 1.7 中运行相同的命令,如下面的示例代码(cryptData 方法)。它运行良好,但我没有得到输出(加密数据)。

  3. 我可以运行任何没有来自 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


【解决方案1】:

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);

【讨论】:

  • 谢谢!!我会在几个小时后检查。
猜你喜欢
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多