Вывод StringBuilder пуст, при выполнении команды linux echo - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь выполнить в Java эту команду, и мне нужно получить вывод в строке Java.Команда шифрует обычный текст парольной фразой и возвращает зашифрованный простой текст.

Команда:
/ bin / sh -c echo "textToEncrypt" |/ usr / bin / openssl enc -aes-256-cbc -e -base64 -A -pass pass: passwordPhrase


Снимок экрана:
enter image description here

Я делаю следующее:

  1. Я могу запустить команду в оболочке Linux, и я получаю зашифрованную строку вывода в оболочке,например: «U2FsdGVkX1 / 1UcPzhX7IGgvXdx9YrS + cizrla8UYhU8 =», поэтому команда работает.

  2. Я могу запустить ту же команду в Java 1.7, как в примере кода ниже (метод cryptData).Он работает нормально, но я не получаю вывод (зашифрованные данные).

  3. Я могу запустить любую команду без "echo" из Java, например, ("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();
    }
    }




Конечный результат всегда: «Удачи!»но вывод пуст или нулевой с этим кодом.Что я делаю не так?

1 Ответ

0 голосов
/ 09 мая 2019

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