使用 ProcessBuilder read/write 到 telnet 进程
Using ProcessBuilder to read/write to telnet process
我正在尝试 read/write 值 from/to telnet
通过 ProcessBuilder
处理。
public static void main(String[] args) {
try {
telnetProcess = new ProcessBuilder("C:\Windows\System32\telnet.exe","x.x.x.x").start();
telnetInputReader = new BufferedReader(new InputStreamReader(telnetProcess.getInputStream()));
telnetOuputWriter = new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream()));
expectPattern("login:");
sendCmd("user");
expectPattern("password:");
sendCmd("pwd");
expectPattern("switch>#");
sendCmd("exit");
expectPattern("Connection to host lost");
} catch (IOException ex) {
System.out.println("Exception : " + ex);
}
}
我收到以下错误
java.io.IOException: Cannot run program "C:\Windows\System32\telnet.exe": CreateProcess error=2, The system cannot find the file specified
我尝试将文件路径更改为 unix 格式样式,例如 C:/Windows/System32/telnet.exe
,但没有成功。 (虽然我预计它不会起作用)。然后将 telnet.exe
从它的位置复制到其他用户的主目录,我没有收到任何错误。 (???)
但是,我没有看到预期的输出。我没有从进程中得到任何响应,代码退出了。
public static void sendCmd(String cmd) {
System.out.println(cmd);
try {
telnetOuputWriter.write(cmd + "\n", 0, cmd.length());
} catch (IOException ex) {
Logger.getLogger(TelnetProcessHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static String expectPattern(String pattern) {
String cmdResponse = "";
try {
String line = "";
// Always getting 'null' here
while ((line = telnetInputReader.readLine()) != null) {
System.out.println(line);
cmdResponse += line;
if (line.contains(pattern)) {
break;
}
}
} catch (IOException ex) {
System.out.println("ex : " + ex);
}
return cmdResponse;
}
这有什么问题吗?然后,另一个查询。我尝试使用 PrintWriter
写入进程,而进程中又包含 BufferedWriter
,例如
telnetOuputWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream())));
在这种情况下可以使用 PrintWriter
吗?
注意: 由于某些原因,我想坚持使用进程方式的 telnet,而不是 Socket
或 TelnetClient
或 expect4j
.
telnet程序不使用标准输入输出流与用户通信,需要直接使用控制台设备。你必须找到一种替代方法来做你想做的事情。
例如,您可以使用实现 telnet 协议的 Java 库。例如,请参阅此问题:Open source Telnet Java API
我正在尝试 read/write 值 from/to telnet
通过 ProcessBuilder
处理。
public static void main(String[] args) {
try {
telnetProcess = new ProcessBuilder("C:\Windows\System32\telnet.exe","x.x.x.x").start();
telnetInputReader = new BufferedReader(new InputStreamReader(telnetProcess.getInputStream()));
telnetOuputWriter = new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream()));
expectPattern("login:");
sendCmd("user");
expectPattern("password:");
sendCmd("pwd");
expectPattern("switch>#");
sendCmd("exit");
expectPattern("Connection to host lost");
} catch (IOException ex) {
System.out.println("Exception : " + ex);
}
}
我收到以下错误
java.io.IOException: Cannot run program "C:\Windows\System32\telnet.exe": CreateProcess error=2, The system cannot find the file specified
我尝试将文件路径更改为 unix 格式样式,例如 C:/Windows/System32/telnet.exe
,但没有成功。 (虽然我预计它不会起作用)。然后将 telnet.exe
从它的位置复制到其他用户的主目录,我没有收到任何错误。 (???)
但是,我没有看到预期的输出。我没有从进程中得到任何响应,代码退出了。
public static void sendCmd(String cmd) {
System.out.println(cmd);
try {
telnetOuputWriter.write(cmd + "\n", 0, cmd.length());
} catch (IOException ex) {
Logger.getLogger(TelnetProcessHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static String expectPattern(String pattern) {
String cmdResponse = "";
try {
String line = "";
// Always getting 'null' here
while ((line = telnetInputReader.readLine()) != null) {
System.out.println(line);
cmdResponse += line;
if (line.contains(pattern)) {
break;
}
}
} catch (IOException ex) {
System.out.println("ex : " + ex);
}
return cmdResponse;
}
这有什么问题吗?然后,另一个查询。我尝试使用 PrintWriter
写入进程,而进程中又包含 BufferedWriter
,例如
telnetOuputWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream())));
在这种情况下可以使用 PrintWriter
吗?
注意: 由于某些原因,我想坚持使用进程方式的 telnet,而不是 Socket
或 TelnetClient
或 expect4j
.
telnet程序不使用标准输入输出流与用户通信,需要直接使用控制台设备。你必须找到一种替代方法来做你想做的事情。
例如,您可以使用实现 telnet 协议的 Java 库。例如,请参阅此问题:Open source Telnet Java API