StringBuilder输出为空,执行linux echo命令

时间:2019-05-09 15:02:49

标签: java linux stream stringbuilder processbuilder

我正在尝试在Java中执行此命令,我需要获取输出 在java字符串中。该命令使用密码短语加密纯文本,然后返回加密的纯文本。

命令是:
/ bin / sh -c回显“ textToEncrypt” | / usr / bin / openssl enc -aes-256-cbc -e -base64 -A -pass pass:passwordPhrase


截屏:
enter image description here

我执行以下操作:

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




最终结果始终是:“成功!”但此代码的输出为空或为null。我在做什么错了?

1 个答案:

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