java通过telnet远程连接Linux服务器或者olt终端并执行代码输出到界面

       此处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的)

可以根据你自己需求调整参数,参考以上就行。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惊弦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值