Попытка вернуть вывод команды Unix в виде строки в Java не дает ожидаемых результатов

Я пытаюсь создать небольшую программу на Java, которая позволит мне получить доступ к удаленному серверу Unix, запустить некоторые команды, а затем отобразить вывод этих команд в среде IDE.

Я собирал кусочки кода и пытался понять, как это работает, по мере продвижения, что, вероятно, не идеально!

В настоящее время я могу запускать команды с консоли и видеть результаты на сервере, но мне не удалось отправить вывод обратно на консоль. Всякий раз, когда я пытаюсь отправить их обратно в виде строки, я получаю что-то вроде java.lang.UNIXProcess$ProcessPipeInputStream@9x57d1ad вместо обычного вывода, который я вижу на сервере. Я уверен, что есть что-то очевидное, что я делаю неправильно, но я новичок, и, несмотря на то, что я потратил часы на поиски, я пока не смог найти решение. Я был бы очень признателен за помощь. Спасибо!

РАБОТАЕТ НА СЕРВЕРЕ:

public static void main(String[] args) {
    try {
        ServerSocket serverSocket = new ServerSocket(portNumber);
        Socket clientSocket = serverSocket.accept();
        PrintWriter out =
                new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
                new InputStreamReader(clientSocket.getInputStream()));

        while ((inputLine = in.readLine()) != null) {

            out.println(inputLine);

            if (inputLine.equals("storage")) {
                runStorage();
                printResults(runStorage()); }

     catch (Exception e) {

        e.printStackTrace();

    }

public static Process runStorage() throws IOException {

    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.command("df", "-h");

    Process process = processBuilder.start();
    printResults(process);

    return process;

}

public static String printResults(Process process) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line = "";
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
    return line;  }

КЛИЕНТ:

        public class ClientInitiator {

            public static void main(String[] args) throws IOException, InterruptedException {

                String hostName = "myHostNameGoesHere";
                Socket echoSocket = new Socket(hostName, portNumber);
                PrintWriter out =
                        new PrintWriter(echoSocket.getOutputStream(), true);
                BufferedReader in =
                        new BufferedReader(
                                new InputStreamReader(echoSocket.getInputStream()));
                BufferedReader stdIn =
                        new BufferedReader(
                                new InputStreamReader(System.in));


                {
                    String userInput;

                    while (!(userInput = stdIn.readLine()).equals("")) {
                        out.println(userInput);
                        if (userInput.equals("storage")) {
                            String serverResponse = in.readLine();
                            System.out.println(serverResponse);}

person James    schedule 04.08.2020    source источник


Ответы (1)


Чтобы получить вывод запущенного процесса, попробуйте следующий код.

InputStream is = process.getInputStream();  
InputStreamReader isr = new InputStreamReader(is);  
BufferedReader br = new BufferedReader(isr);  
String line;  
while ((line = br.readLine()) != null) {  
  System.out.println(line);  
}  
person Mean Coder    schedule 04.08.2020
comment
Спасибо за вашу помощь, я не уверен, где я должен разместить этот код? Не могли бы вы дать мне указатель? - person James; 04.08.2020
comment
Вы можете добавить этот код там, где вы вызываете метод runStorage. Вызовите таким образом Process process = runStorage();, а затем скопируйте и вставьте код, указанный после оператора. - person Mean Coder; 04.08.2020
comment
Разве нет чего-то об отдельном потоке ошибок, который также должен обрабатываться и извлекаться с помощью getErrorStream()? - person Scratte; 04.08.2020
comment
@Scratte Да; но вы можете указать ProcessBuilder мультиплексировать ошибку и вывести ее в один и тот же входной поток, что НЕ используется по умолчанию. Итак, явно перейдите: pb.redirectErrorStream(true); - person rzwitserloot; 04.08.2020