此处Java代码皆是用Intellij IDEA编写,以下分为连接Linux服务器或者olt终端两个部分,Linux用到Ubuntu虚拟机,主要用于测试完善后,再连接olt。
首先,要通过telnet远程连接服务器,需要先下载commons-net-3.4.jar,因为TelnetClient是commons-net-3.3.jar下的一个类,是用于实现telnet连接的,这里不赘述,百度可以找到很多包。
一、telnet连接Linux终端
以下我把内容分为主要操作、展示界面和运行三个部分,更加清晰。
1.主要操作
telnet_main
import org.apache.commons.net.telnet.TelnetClient;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
public class telnet_main extends JFrame {
private TelnetClient telnet = new TelnetClient();
private InputStream in;
private PrintStream out;
private char prompt = '$';// 普通用户结束
private String user;// 用户
private String password;// 密码
/**
* 主方法运行呢
*
* @param ip
* @param port
* @param user
* @param password
* @since: 1.0.0
* @return:null
* @author:SuWenyu
* @date:2021/9/9 16:51
*/
public telnet_main(String ip, int port, String user, String password) {
try {
this.password = password;
this.user = user;
telnet.connect(ip, port);
in = telnet.getInputStream();
out = new PrintStream(telnet.getOutputStream());
login(user, password);//登录方法
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 登录
*
* @param user
* @param password
* @since: 1.0.0
* @return:void
* @author:SuWenyu
* @date:2021/8/27 9:51
*/
public void login(String user, String password) {
//其实这个还是要看你连接的终端,请求输入用户名和密码的标识字符是什么,别写错,不然无法登录
readUntil("login:");//“localhost login:“输入用户名的起点字符
write(user);
readUntil("Password:");//"Password:"起点字符
write(password);//密码不会显示
readUntil(prompt + "");
}
/**
* 读取分析结果
*
* @param pattern
* @since: 1.0.0
* @return:String
* @author:SuWenyu
* @date:2021/8/27 9:52
*/
public String readUntil(String pattern) {
try {
char lastChar = pattern.charAt(pattern.length() - 1);
StringBuffer sb = new StringBuffer();
//给字符转码,使输出的中文不乱码
InputStreamReader br = new InputStreamReader(in, "utf-8");
char ch = (char) br.read();
while (true) {
System.out.print(ch);//放在这里才能显示完整命令
sb.append(ch);
if (ch == lastChar) {//匹配到结束标识时返回结果
if (sb.toString().endsWith(pattern)) {
return sb.toString();
}
}
ch = (char) br.read();
// System.out.print(ch);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 发送命令
*
* @param value
* @since: 1.0.0
* @return:void
* @author:SuWenyu
* @date:2021/8/27 9:52
*/
public void write(String value) {
try {
out.println(value);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 向目标发送命令字符串,并返回执行结果
* 问题:因为结束标识符为#,所以使用命令你”cat“查看文件无法显示包含"#"的文件内容
*
* @param command
* @since: 1.0.0
* @return:String
* @author:SuWenyu
* @date:2021/8/27 9:52
*/
public String sendCommand(String command) {
try {
write(command);//输入命令
if (command == "sudo su") {//进入root模式,linux虚拟机
readUntil("密码:");
write(password);//重新输入密码
this.prompt = '#';//重新定义标识符,root模式下终止标识符变为”#“
}
return readUntil(prompt + "");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭连接
*
* @param
* @since: 1.0.0
* @return:void
* @author:SuWenyu
* @date:2021/8/27 9:53
*/
public void disconnect() {
try {
telnet.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 将文本数据按行读取返回字符串数据
*
* @param file
* @since: 1.0.0
* @return:String
* @author:SuWenyu
* @date:2021/8/27 9:53
*/
public static String txt2String(File file) {
StringBuilder result = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
String s;
while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
if (s.length() > 60) {//这里是数据切割,使能适应输出到面板上
//判断每一行的字符数,若超过限制则转行录入,保证后期输出到面板上滚动条能滚到底
String s1 = s.substring(0, 60);//切开两部分分别成行
String s2 = s.substring(61);
result.append(System.lineSeparator() + s1);
result.append(System.lineSeparator() + s2);
} else {
result.append(System.lineSeparator() + s);
}
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return result.toString();
}
}
2.展示界面(用JFrame写的,可以自行按需求编写)
telnet_frame2
import javax.swing.*;
import javax.swing.text.DefaultCaret;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
/**
* @author Administrator
* @version 1.0.0
* @ClassName oltManage.com.apptest.telnet_frame.java
* @Description TODO
* @createTime 2021年08月27日 09:44:00
*/
public class telnet_frame2 extends JFrame implements ActionListener{
/**
* 显示界面
*
* @since: 1.0.0
* @param rs1
* @return:void
* @author:SuWenyu
* @date:2021/8/27 9:56
*/
JTextArea textarea;//全局变量
public void tab2(String rs1) throws IOException {
Container c = this.getContentPane();//构造一个容器
c.setLayout(new BorderLayout(1, 1));
((JComponent) c).setBorder(BorderFactory.createLineBorder(Color.WHITE, 5));
getBackground();
c.setBackground(Color.LIGHT_GRAY);
//已执行的命令以及执行结果
JPanel jp1 = new JPanel();
textarea = new JTextArea(20,60);
textarea.setText(rs1);
textarea.setLineWrap(true);//激活自动换行功能
textarea.setWrapStyleWord(true);// 激活断行不断字功能
textarea.setEditable(false);//设置为不可编辑,仅作显示用
JScrollPane scrollPane = new JScrollPane();
//自动出现垂直滚动条
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
scrollPane.setViewportView(textarea);
//下面这段代码,都是为了使滚动条一直滑动到底部
scrollPane.getViewport().add(textarea, null);
Point p = new Point();
p.setLocation(0, textarea.getLineCount() * 20);
scrollPane.getViewport().setViewPosition(p);
jp1.add(scrollPane);
c.add(jp1);
setLocation(200, 100);//窗口在电脑窗口的位置
this.setSize(770, 400);//窗口大小
this.setVisible(true);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setResizable(false);//窗口不能放大缩小,窗口尺寸固定
}
}
3.运行
telnet_run
import java.io.File;
import java.io.FileReader;
import java.io.PrintStream;
public class telnet_run {
public void telnet_run() {
}
/**
* 主方法运行
*
* @param args
* @since: 1.0.0
* @return:void
* @author:SuWenyu
* @date:2021/8/27 9:54
*/
public static void main(String[] args) {
try {
//将控制台的数据全部输入到文本文件中保存
System.setOut(new PrintStream("./log.txt"));
telnet_main tel = new telnet_main("192.168.10.120", 23, "root", "admin");
//有部分Linux会因为终端无法显示颜色而出现不规律符号,而且导致其他问题
//tel.sendCommand("ls");
tel.sendCommand("ls -lh --color=never");//因此可用这条命令查看所有文件
tel.sendCommand("ls --color=never");//never:从不使用颜色表示不同类型
tel.sendCommand("ifconfig");
tel.sendCommand("sudo su");//进入root模式
tel.sendCommand("cd");
tel.sendCommand("cd /etc/");
tel.sendCommand("ls --color=never");
File file = new File("./log.txt");//txt文本存放目录
String rs0 = tel.txt2String(file);//将文本文件规整输出为字符串
telnet_frame2 t2 = new telnet_frame2();//将数据输出到面板中,简单测试
t2.tab2(rs0);
tel.disconnect();//关闭连接
} catch (Exception e) {
// TODO: handle exception
}
}
}
二、telnet连接olt终端
1.主要操作
telnet_main
import org.apache.commons.net.telnet.TelnetClient;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
public class telnet_main extends JFrame {
private TelnetClient telnet = new TelnetClient();
private InputStream in;
private PrintStream out;
// private char prompt = '$';// 普通用户结束
private char prompt = '>';
private String user;// 用户
private String password;// 密码
/**
* 主方法运行呢
*
* @param ip
* @param port
* @param user
* @param password
* @since: 1.0.0
* @return:null
* @author:SuWenyu
* @date:2021/9/9 16:51
*/
public telnet_main(String ip, int port, String user, String password) {
try {
this.password = password;
this.user = user;
telnet.connect(ip, port);
in = telnet.getInputStream();
out = new PrintStream(telnet.getOutputStream());
login(user, password);//登录方法
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 登录
*
* @param user
* @param password
* @since: 1.0.0
* @return:void
* @author:SuWenyu
* @date:2021/8/27 9:51
*/
public void login(String user, String password) {
//其实这个还是要看你连接的终端,请求输入用户名和密码的标识字符是什么,别写错,不然无法登录
readUntil("User name:");
write(user);
readUntil("User password:");
write(password);//密码不会显示
readUntil(prompt + "");
}
/**
* 读取分析结果
*
* @param pattern
* @since: 1.0.0
* @return:String
* @author:SuWenyu
* @date:2021/8/27 9:52
*/
public String readUntil(String pattern) {
try {
char lastChar = pattern.charAt(pattern.length() - 1);
StringBuffer sb = new StringBuffer();
//给字符转码,使输出的中文不乱码
InputStreamReader br = new InputStreamReader(in, "utf-8");
char ch = (char) br.read();
while (true) {
System.out.print(ch);//放在这里才能显示完整命令
sb.append(ch);
if (ch == lastChar) {//匹配到结束标识时返回结果
if (sb.toString().endsWith(pattern)) {
return sb.toString();
}
}
ch = (char) br.read();
// System.out.print(ch);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 发送命令
*
* @param value
* @since: 1.0.0
* @return:void
* @author:SuWenyu
* @date:2021/8/27 9:52
*/
public void write(String value) {
try {
out.println(value);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 向目标发送命令字符串,并返回执行结果
* 问题:因为结束标识符为#,所以使用命令你”cat“查看文件无法显示包含"#"的文件内容
*
* @param command
* @since: 1.0.0
* @return:String
* @author:SuWenyu
* @date:2021/8/27 9:52
*/
public String sendCommand(String command) {
try {
write(command);//输入命令
if (command == "enable") {//olt远程控制
this.prompt = '#';//进入配置模式,重新定义标识符
}
return readUntil(prompt + "");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭连接
*
* @param
* @since: 1.0.0
* @return:void
* @author:SuWenyu
* @date:2021/8/27 9:53
*/
public void disconnect() {
try {
telnet.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 将文本数据按行读取返回字符串数据
*
* @param file
* @since: 1.0.0
* @return:String
* @author:SuWenyu
* @date:2021/8/27 9:53
*/
public static String txt2String(File file) {
StringBuilder result = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
String s;
while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
if (s.length() > 60) {//判断每一行的字符数,若超过限制则转行录入,保证后期输出到面板上滚动条能滚到底
String s1 = s.substring(0, 60);//切开两部分分别成行
String s2 = s.substring(61);
result.append(System.lineSeparator() + s1);
result.append(System.lineSeparator() + s2);
} else {
result.append(System.lineSeparator() + s);
// result.append(s+System.lineSeparator());
}
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return result.toString();
}
}
2.同一里面的一样,略。
3.运行
telnet_run
import java.io.File;
import java.io.FileReader;
import java.io.PrintStream;
public class telnet_run {
public void telnet_run() {
}
/**
* 主方法运行
*
* @param args
* @since: 1.0.0
* @return:void
* @author:SuWenyu
* @date:2021/8/27 9:54
*/
public static void main(String[] args) {
try {
//将控制台的数据全部输入到文本文件中保存
System.setOut(new PrintStream("./log.txt"));
telnet_main tel = new telnet_main("120.196.132.179", 4455, "root", "admin");
tel.sendCommand("enable");
tel.sendCommand("config");//输入命令
tel.sendCommand("display ont autofind all");
tel.sendCommand("display ont info all");
tel.sendCommand("display ont ?\n");
File file = new File("./log.txt");//txt文本存放目录
String rs0 = tel.txt2String(file);//将文本文件输出为字符串
telnet_frame2 t2 = new telnet_frame2();//将数据输出到面板中,简单测试
t2.tab2(rs0);
tel.disconnect();//关闭连接
} catch (Exception e) {
// TODO: handle exception
}
}
}
三、其他
1. 连接不通服务器的展示界面和运行代码基本都是一样的,运行界面仅是不同的终端命令输入不一样,主要是操作部分,不同终端运用的标识符不一样,连接前记得看清楚你要连接的终端结束标识符到底是什么,例如Ubuntu里Linux的普通用户结束标识符为“$”,root用户的为“#”;olt里未进行配置时为“>”,进入配置时为“#”。
2.telnet_main tel = new telnet_main("120.196.132.179", 4455, "root", "admin");里面,除非特别配置的,不然Telnet作为TCP/IP协议族中的一员,端口号都为23。
3.另外,使用代码telnet远程服务器前,记得把服务器的telnet服务打开,正常安装打开了都不行的话,多半是防火墙的问题,关掉就好了。
四、最后展示一下运行结果(olt的)
可以根据你自己需求调整参数,参考以上就行。