В Java отправляйте команды в другую программу командной строки - PullRequest
9 голосов
/ 21 мая 2010

Я использую 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(); }

Ответы [ 4 ]

3 голосов
/ 21 мая 2010

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

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

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

3 голосов
/ 21 мая 2010

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

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

2 голосов
/ 21 мая 2010

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

1 голос
/ 21 мая 2010

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

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

...