В Java отправьте команды в другую программу командной строки

Я использую Java на Windows XP и хочу смочь отправить команды в другую программу, такие как telnet. Я не хочу просто выполнять другую программу. Я хочу выполнить его и затем отправить ему последовательность команд, после того как это работает. Вот мой код того, что я хочу сделать, но он не работает: (Если Вы не комментируете и изменяете команду на "cmd", это работает как ожидалось. Помогите.) Это - упрощенный пример. В производстве будет намного больше отправленных команд, поэтому не предлагайте назвать "telnet localhost".

    try
    {
        Runtime rt = Runtime.getRuntime();

        String command = "telnet";
        //command = "cmd";
        Process pr = rt.exec(command);

        BufferedReader processOutput = new BufferedReader(new InputStreamReader(pr.getInputStream()));
        BufferedWriter processInput = new BufferedWriter(new OutputStreamWriter(pr.getOutputStream()));

        String commandToSend = "open localhost\n";
        //commandToSend = "dir\n" + "exit\n";

        processInput.write(commandToSend);
        processInput.flush();

        int lineCounter = 0;
        while(true)
        {
            String line = processOutput.readLine();
            if(line == null) break;
            System.out.println(++lineCounter + ": " + line);
        }

        processInput.close();
        processOutput.close();
        pr.waitFor();
    }
    catch(Exception x)
    {
        x.printStackTrace();
    }
9
задан bradvido 20 May 2010 в 20:37
поделиться

4 ответа

Это выглядит нормально, так как он не будет производить столько вывода, но вы действительно должны читать и писать в отдельных потоках, чтобы он не заполнял буфер и не блокировался, ожидая, когда вы прочитаете прежде чем вы перейдете к следующему шагу.

Итак, если он достигает точки, в которой вы сбрасываете отправляемую ему команду, выясните, поддерживает ли клиент telnet Windows получение команд со стандартного ввода, а не с консоли, передавая текст, который вы отправляете, на его стандартный ввод. в командной строке.

Например, echo dir c: \ | cmd запускает cmd, выводит список содержимого диска c: и завершает работу, почти так же, как если бы вы набрали dir c: \ в консоли. Но echo open localhost | telnet заставляет telnet очищать экран, а затем закрывать его, а не вести себя так, как если бы вы ввели его в консоль. Поскольку telnet необходимо маскировать вводимые пользователем пароли, вполне вероятно, что он использует консольный API вместо чтения со стандартного ввода. Это help не перечисляет никаких аргументов команды, чтобы сказать ему читать со стандартного ввода, поэтому, возможно, вам нужно использовать реализацию telnet, которая лучше подходит для написания сценариев.

3
ответ дан 4 December 2019 в 21:48
поделиться

Если вы хотите программно управлять сеансом telnet из Java, вы можете использовать эту библиотеку telnet Java ... вы можете делать то же самое (открывать соединения, отправлять имя пользователя / пароль, отправлять команды и получить результаты), но без создания отдельного процесса.

2
ответ дан 4 December 2019 в 21:48
поделиться

Это не прямой ответ на ваш вопрос, но ...

Вместо использования Runtime.exec () вы должны использовать ProcessBuilder и перенаправить stderr От до stdout ( ProcessBuilder.redirectErrorStream (true) ). В противном случае ваш процесс может заблокироваться, если он что-то напишет на stderr (Windows не любит, когда вывод процесса не читается).

3
ответ дан 4 December 2019 в 21:48
поделиться

Вы можете взглянуть на задачу Telnet Ant , которую можно вызвать прямо в коде, без использования файла build.xml .

Вы также можете взглянуть на исходный код и увидеть, как они это делают.

1
ответ дан 4 December 2019 в 21:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: