java使用telnet連線交換機並管理交換機
像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控制碼過濾,我沒有仔細研究。
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 共同學習!
相關文章
- 管理型交換機和非管理型交換機區別
- 遠端管理交換機
- 智慧管理PoE交換機
- 華為交換機的5種TELNET設定
- Cisco 交換機之間的連線方法(轉)
- 二層交換機 三層交換機 四層交換機的區別
- 用串列埠連線 設定超級終端管理交換機(轉)串列埠
- 三層交換機怎麼設定路由連線路由
- 通過telnet登入交換機:password required, but none setUINone
- 全國產交換機、軍用交換機與普通交換機到底有啥區別?
- 華為交換機和銳捷交換機埠隔離
- 【轉】交換機開發(一)—— 交換機的工作原理
- 核心交換機光纖埠級連線方式與型別型別
- 二層交換機和三層交換機的區別
- 一個查埠連線交換機的一條線的技術
- 交換機基礎
- 交換機測試
- 透過交換機連線伺服器管理節點檢查AWS雲狀態伺服器
- 工業級交換機和網路級交換機區別?
- 工業交換機與商業交換機區別對比
- 資料中心交換機與普通交換機有什麼不同?
- 交換機埠總結
- HUAWEI交換機埠映象
- 華為交換機VLAN配置
- 二層、三層交換機和四層交換機的區別(轉)
- 二層交換機鏈路聚合、三層交換機鏈路聚合和三層交換機的單臂路由專案路由
- 【轉】交換機開發(二)—— 三層交換機報文轉發過程
- 乙太網交換機介面及連線方法介紹【詳細圖文】
- 交換技術:軟交換機的概念、特徵和作用(轉)特徵
- 交換機及路由基礎路由
- 網路(1)——交換機配置
- 網咖交換機配置教程
- 交換機埠安全總結
- 二層交換機埠模式模式
- 華為交換機埠映象配置
- 交換機配置命令說明
- 交換機基礎及stp
- 華為交換機配置acl策略