java使用telnet連線交換機並管理交換機

業餘草發表於2014-09-17
像crt或者ssh、甚至是cmd命令中使用window的telnet命令連線交換機。都可以起到控制交換機的作用。
telnet說白了就是一個tcp的長連線。你向交換機輸入一組命令,其實就是你使用socket連線上交換機,把你的命令out出去。
如果你想看你執行的命令,返回了什麼,你就是用io流直接讀取socket中的長連線流中的內容即可。telnet其實就是這麼簡單。


使用java連線telnet進行操作的注意
1.telnet有VT100 VT52 VT220 VTNT ANSI等協議。
我用vt100。
2.vt100控制碼(ansi控制碼)過濾的問題,可以過濾,也可以在服務設定不要。
不過濾都是一些亂碼。是以\033[***一個字母結尾的格式。
3.中文亂碼的問題。
new String(old.getBytes("ISO8859-1"),"GBK")。
4.如何判斷讀取到最後了。
一有readUntil(),二有使用執行緒。
5.選擇telnet的java包問題,包有很多,比如appache(commons-net-3.0.jar), ganymed(ganymed-ssh2-build210.jar),javaexpect(smart-0.1-SNAPSHOT-jar-with-dependencies.jar)
我使用appache。javaexpect有帶的vt100控制碼過濾,我沒有仔細研究。

6.write要flush()才傳送。

看程式碼吧:

package com.telnet.test;

import java.io.InputStream;
import java.io.PrintStream;

import org.apache.commons.net.telnet.TelnetClient;

import com.telnet.constant.TelnetConstant;

public class TelnetMain {
	
    private TelnetClient telnet = new TelnetClient("VT100");

    private InputStream in;

    private PrintStream out;

    private static final String DEFAULT_AIX_PROMPT = "#";
    private static final String ENTER_COMMAND_ARROW = ">";
    private static final String ENTER_COMMAND_BRACKETS = "]";
    private static final String ENTER="\n";


    /**
     * telnet 埠
     */
    private String port;

    /**
     * 使用者名稱
     */
    private String user;

    /**
     * 密碼
     */
    private String password;

    /**
     * IP 地址
     */
    private String ip;

    public TelnetMain(String ip, String user, String password) {
        this.ip = ip;
        this.port = String.valueOf(23);
        this.user = user;
        this.password = password;
    }

    public TelnetMain(String ip, String port, String user, String password) {
        this.ip = ip;
        this.port = port;
        this.user = user;
        this.password = password;
    }

    /**
     * @return boolean 連線成功返回true,否則返回false
     */
    private boolean connect() {

        boolean isConnect = true;

        try {
        	
            telnet.connect(ip, Integer.parseInt(port));
            in = telnet.getInputStream();
            out = new PrintStream(telnet.getOutputStream());
            telnet.setKeepAlive(true);
            write(password);
            String msg=readUntil(ENTER_COMMAND_ARROW);
            System.out.println(msg);
            write("system-view");
            msg=readUntil("\n");
            System.out.println(msg);
            msg=readUntil("\n");
            System.out.println(msg);
            write("display interface ");
            msg=readUntil("\n");
            System.out.println(msg);
            msg=readUntil(ENTER_COMMAND_BRACKETS);
            System.out.println(msg);

        } catch (Exception e) {
            isConnect = false;
            e.printStackTrace();
            return isConnect;
        }
        return isConnect;
    }

    public void su(String user, String password) {
        try {
            write("su" + " - " + user);
            readUntil("Password:");
            write(password);
            readUntil(DEFAULT_AIX_PROMPT);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String readUntil(String pattern) {
        try {
            char lastChar = pattern.charAt(pattern.length() - 1);
            StringBuffer sb = new StringBuffer();
            char ch = (char) in.read();
            while (true) {
                //System.out.print(ch);// ---需要註釋掉
                sb.append(ch);
                if (ch == lastChar) {
                    if (sb.toString().endsWith(pattern)) {
                        return sb.toString();
                    }
                }
                ch = (char) in.read();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public void write(String value) {
        try {
            out.println(value);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String sendCommand(String command) {
        try {
            write(command);
            return readUntil(DEFAULT_AIX_PROMPT);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    private void disconnect() {
        try {
            telnet.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private String getNowDate() {
        this.connect();
        String nowDate = this.sendCommand("date|awk '{print $2,$3,$4}'");
        String[] temp = nowDate.split("\r\n");
        // 去除命令字串
        if (temp.length > 1) {
            nowDate = temp[0];
        } else {
            nowDate = "";
        }
        this.disconnect();
        return nowDate;
    }

    public static void main(String[] args) {
        try {
        	TelnetMain telnet = new TelnetMain("10.10.2.249", "Huawei", "Huawei");
    		System.setOut(new PrintStream("D:/telnet.txt"));
        	telnet.connect();
            telnet.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
輸出的內容在telnet.txt檔案中,我貼出來給大家看看!



如有疑問,請加qq群:135430763 共同學習!

相關文章