zoukankan      html  css  js  c++  java
  • Java调用Telnet示例

    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("login:");
    			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.2.19", 23, "administrator", "123456");
    		String rs = telnet.sendCommand("ipconfig");
    		try {
    			rs = new String(rs.getBytes("ISO-8859-1"),"GBK");	//转一下编码
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		}
    		System.out.println(rs);
    	}
    	
    }


  • 相关阅读:
    JavaScript文件加载器LABjs API详解 转
    AMD及requireJS 转
    C#中数组、ArrayList和List三者的区别 转
    CSS魔法堂:那个被我们忽略的outline
    CSS魔法堂:改变单选框颜色就这么吹毛求疵!
    CSS魔法堂:display:none与visibility:hidden的恩怨情仇
    CSS魔法堂:一起玩透伪元素和Content属性
    CSS魔法堂:稍稍深入伪类选择器
    CSS魔法堂:更丰富的前端动效by CSS Animation
    CSS魔法堂:Transition就这么好玩
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3373674.html
Copyright © 2011-2022 走看看