2016-06-01 4 views
0

В настоящее время я пытаюсь написать файл Java для de/encoding base64 в оболочке linux. Метод, который я до сих пор является:Ядро вывода ловушки Java

public static String cmdExec(String Base64String) throws java.io.IOException, java.lang.InterruptedException{ 
    String line; 

    try { 
     Process p = Runtime.getRuntime().exec("openssl enc -base64 -d <<< " + Base64String); 
     BufferedReader input = new BufferedReader 
      (new InputStreamReader(p.getInputStream())); 
      while ((line = input.readLine()) != null) { 
      output += (line); 
     } 
     input.close(); 
     } 
    catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    System.out.println(output); 
    return output; 
} 

К сожалению, я не получаю выход, хотя команда работает, если я введите его вручную в раковине.
Я знаю, что есть Java Encoder с Java 8, а также apache-решение, но мне бы очень хотелось, чтобы он работал через командную строку.

Есть ли что-нибудь, что я делаю неправильно?

+1

У вас есть ошибки? Правильна ли команда 'exec'? Это работает, когда вы запускаете ту же команду с терминала? Вы уверены, что он работает без абсолютного пути к исполняемому файлу? Что делает '<<<' и делает это без интерпретатора, такого как' bash'? Почему вы разделяете команду на несколько строковых литералов, что затрудняет их чтение? – Thilo

+1

Все «whys» Thilo плюс почему вы просто не используете команду 'base64' Linux вместо' openssl'? Вы пытаетесь перенаправить ввод с помощью '<<<'? Если это так, вы можете использовать опцию '-in' для' openssl enc'. – mhawke

+0

Спасибо за ответ! Я не получаю никаких ошибок, и команда exec работает для меня. Также он работает, если в командной строке введите команду. Я нашел команду openssl в качестве альтернативы, например. echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode, потому что, если я использую эхо-сигнал, мой вывод - QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode (хотя это также работает для меня, если я набираю его сам в оболочке). Вы правы с расщеплением команды, извините за это ... – tobisetsfire

ответ

1

Это не работает, потому что ребенок не запускается в оболочке, поэтому попытка Перенаправление буквально рассматривается как аргумент openssl. Поэтому openssl жалуется, что <<< является недопустимым вариантом. Вы можете это увидеть, взяв и распечатав стандартную ошибку ребенка с помощью p.getErrorStream() так же, как и для стандартного вывода. Также значение выходного процесса дочернего процесса доступно с p.exitValue() - вы тоже должны это проверить.

Теперь аргумент Base64String - это кодированный в base64 текст, который вы хотите декодировать, поэтому вам нужно отправить этот текст в качестве ввода для дочернего элемента. Вы можете получить стандартный ввод ребенка с p.getOuputStream(), а затем записать в поток:

Process p = Runtime.getRuntime().exec("openssl enc -base64 -d"); 
// Process p = Runtime.getRuntime().exec("base64 -d"); // the base64 command also works 
BufferedWriter toChild = new BufferedWriter(
          new OutputStreamWriter(p.getOutputStream())); 
toChild.write(Base64String + "\n"); 
toChild.close(); 

После того, как вы закрыли стандартный ввод ребенка вы можете прочитать расшифрованный вывод, используя p.getInputStream() как вы в настоящее время делаете. Как уже упоминалось выше, вы должны проверить значение выхода ребенка (ненулевое значение означает, что произошла ошибка в дочернем элементе), и собрать stderr для ребенка, чтобы он мог отображаться, если значение выхода отличное от нуля.

И последнее, команда base64 -d также работает, как правило, присутствует в качестве базовой утилиты linux и не требует установки openssl.

+0

Спасибо за ваш ответ! cmdLine - это строка, называемая «QWxhZGRpbjpvcGVuIHNlc2FtZQ ==», которую я хочу декодировать (сохраняя этот пример) «Aladdin: open sesame». Я пробовал описанные шаги, но System.out.println (output); по-прежнему ничего не печатает (новые строки) вместо ожидаемой фразы. – tobisetsfire

+1

Ну '<<<' будет работать только в оболочке, но 'exec()' не выполняет команду с использованием оболочки, поэтому перенаправление не будет работать. Вам нужно написать закодированную строку для стандартного ввода для ребенка - для этого используйте 'p.getOutputStream(). Я обновил свой ответ, чтобы показать, как это сделать. – mhawke

+0

Надеюсь, что все эти шаги иллюстрируют, почему лучше использовать чистое Java-решение для чего-то простого, как кодирование Base64. – Thilo

-1

возможно попробовать с Scanner:

String output = ""; 
Process p = Runtime.getRuntime().exec("openssl enc -base64 -d <<< "+cmdLine); 
Scanner s = new Scanner(p.getInputStream()).useDelimiter("\\A"); 
while (s.hasNext()) { 
    output += s.next(); 
} 
s.close(); 
Смежные вопросы