BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #41170同步于 2015/5/27
Java机器人发帖

通过java代码远程访问路由器的问题,在windows命令行里通过teln

Direwolf
2015/5/27镜像同步0 回复
package rt; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import org.apache.commons.net.telnet.TelnetClient; /** * Telnet操作器,基于commons-net-2.2.jar * @author JiangKunpeng * */ public class TelnetOperator { private String prompt = ">"; //结束标识字符串,Windows中是>,Linux中是# private char promptChar = '>'; //结束标识字符 private TelnetClient telnet; private InputStream in; // 输入流,接收返回信息 private PrintStream out; // 向服务器写入 命令 /** * @param termtype 协议类型:VT100、VT52、VT220、VTNT、ANSI * @param prompt 结果结束标识 */ public TelnetOperator(String termtype,String prompt){ telnet = new TelnetClient(termtype); setPrompt(prompt); } public TelnetOperator(String termtype){ telnet = new TelnetClient(termtype); } public TelnetOperator(){ telnet = new TelnetClient(); } /** * 登录到目标主机 * @param ip * @param port * @param username * @param password */ public void login(String ip, int port, String username, String password){ try { telnet.connect(ip, port); in = telnet.getInputStream(); out = new PrintStream(telnet.getOutputStream()); readUntil("Username:"); write(username); readUntil("Password:"); write(password); String rs = readUntil(null); if(rs!=null&&rs.contains("Login Failed")){ throw new RuntimeException("登录失败"); } } catch (Exception e) { throw new RuntimeException(e); } } /** * 读取分析结果 * * @param pattern 匹配到该字符串时返回结果 * @return */ public String readUntil(String pattern) { StringBuffer sb = new StringBuffer(); try { char lastChar = (char)-1; boolean flag = pattern!=null&&pattern.length()>0; if(flag) lastChar = pattern.charAt(pattern.length() - 1); char ch; int code = -1; while ((code = in.read()) != -1) { ch = (char)code; sb.append(ch); //匹配到结束标识时返回结果 if (flag) { if (ch == lastChar && sb.toString().endsWith(pattern)) { return sb.toString(); } }else{ //如果没指定结束标识,匹配到默认结束标识字符时返回结果 if(ch == promptChar) return sb.toString(); } //登录失败时返回结果 if(sb.toString().contains("Login Failed")){ return sb.toString(); } } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } /** * 发送命令 * * @param value */ public void write(String value) { try { out.println(value); out.flush(); } catch (Exception e) { e.printStackTrace(); } } /** * 发送命令,返回执行结果 * * @param command * @return */ public String sendCommand(String command) { try { write(command); return readUntil(prompt); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 关闭连接 */ public void distinct(){ try { if(telnet!=null&&!telnet.isConnected()) telnet.disconnect(); } catch (IOException e) { e.printStackTrace(); } } public void setPrompt(String prompt) { if(prompt!=null){ this.prompt = prompt; this.promptChar = prompt.charAt(prompt.length()-1); } } public static void main(String[] args) { TelnetOperator telnet = new TelnetOperator("VT220",">"); //Windows,用VT220,否则会乱码 telnet.login("192.168.6.12", 23, "zx", "123456789"); String Password="zxr10"; String s = telnet.sendCommand("enable"); System.out.println(s); //telnet.distinct(); /*String rs = telnet.sendCommand("enable"); //telnet.sendCommand("zxr10"); String s=telnet.sendCommand("show ip route");*/ } } 代码如上,通过telnet连接路由器时,报错 java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:196) at java.net.SocketInputStream.read(SocketInputStream.java:122) at java.io.BufferedInputStream.read1(BufferedInputStream.java:273) at java.io.BufferedInputStream.read(BufferedInputStream.java:334) at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) at java.io.BufferedInputStream.read(BufferedInputStream.java:254) at org.apache.commons.net.telnet.TelnetInputStream.__read(TelnetInputStream.java:114) at org.apache.commons.net.telnet.TelnetInputStream.run(TelnetInputStream.java:535) at java.lang.Thread.run(Thread.java:744) 在windows命令行里通过telnet可以登上,代码里不行 求大神指点
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。