`

远程连接Telnet

阅读更多

 

     这是一个远程连接工具,使用的是Apache commons-net.3.3,下面的代码是自己做的封装

    

     maven配置如下:

    

<dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.3</version>
</dependency>
<!--这里是引用了本地的一个jar包,主要服务于WeatherTelnet类-->
<dependency>
            <groupId>commons-net</groupId>
            <artifactId>examples</artifactId>
            <version>3.3</version>
            <scope>system</scope>
            <systemPath>H:\Apache\commons-net\commons-net-examples-3.3.jar</systemPath>
        </dependency>

 

     封装的Telnet类

package com.special.utils.telnet;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.telnet.TelnetClient;

import java.io.*;

/**
 * file TelnetUtil
 * 使用Apache的commons-net 3.3 作为底层,封装的一个远程连接工具包
 * TODO:如果字符串的截取未按理想状态进行,那么程序将挂起,所以最好将byte数组设为一屏的字节
 * @author ds
 * @version 1.0 2015
 *          date 15-3-18
 */
public class TelnetUtil {
    Log log = LogFactory.getLog(TelnetUtil.class);
    /**
     * 终端类型,格式由前缀T_加终端类型构成
     */
    public enum TerminalType {
        T_513, T_715, T_4410, T_4425, T_VT220, T_NTT, T_W2KTT, T_SUNT;

        /**
         * 获取终端类型的类型名称
         *
         * @return 实际类型名称
         */
        public String getTypeName() {
            String name = this.name();
            return name.substring(2, name.length());
        }
    }

    /**
     * 连接失败后,尝试重连的次数 _rCnt作为常量标识
     */
    final Integer _rCnt = 1;
    Integer reCntCount = _rCnt;
    /**
     * 终端输入用户名的提示信息
     */
    final String _logPrompt = "login: ";
    /**
     * 终端输入密码的提示信息
     */
    final String _pwdPrompt = "Password: ";
    /**
     * 终端选择终端类型的提示信息
     */
    final String _terPrompt = "[513]";
    /**
     * 终端输入命令的提示信息
     */
    final String _cmdPrompt = "Command: ";
    /**
     * 客户端
     */
    TelnetClient client;
    /**
     * 终端类型
     */
    String _terName = "W2KTT";
    /**
     * 远程输入流;该处使用过Reader,本来意欲每次读取一行,
     * 但是实验结果表示使用reader导致输出停滞
     */
    InputStream remoteInput;
    /**
     * 远程输出流 ,使用该流主要是使用它的println()功能;
     * 他不需要手动加入回车换行,相当于每输入一次,自动加确认机制
     */
    PrintStream remoteOut;

    /**
     * 构造方法
     *
     * @param host    远程主机域名或者IP
     * @param port    主机的端口号
     * @param terType 终端类型
     */
    public TelnetUtil(String host, Integer port, TerminalType terType) {
        //开启客户端连接
        _terName = terType.getTypeName();
        client = new TelnetClient(_terName);
        //远程连接
        if (getConnect(host, port)) {
            //设置输入输出流
            remoteInput = client.getInputStream();
            remoteOut = new PrintStream(client.getOutputStream());
        } else { //如果连接失败需要初始化流
            remoteInput = new ByteArrayInputStream("connect failure!".getBytes());
            remoteOut = new PrintStream(new ByteArrayOutputStream());
        }
    }

    /**
     * 获取远程连接
     *
     * @param host 主机域名或者IP
     * @param port 主机端口
     * @return boolean true 连接成功 false 连接失败
     */
    private boolean getConnect(String host, Integer port) {
        boolean flag = false;
        try {
            client.connect(host, port);
            flag = true;
        } catch (IOException e) {
            //尝试重复连接,此处可以不使用同步,因为getConnect为私有非静态,并且连接次数也是非静态
            if (!client.isConnected() && reCntCount > 0) {
                reCntCount--;
                if (getConnect(host, port)) {
                    reCntCount = _rCnt;
                    flag = true;
                }
            } else {
                reCntCount = _rCnt;
            }
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 输入用户名、密码登录终端
     *
     * @param name 用户名
     * @param pwd  用户密码
     */
    public void login(String name, String pwd) {
        //输入用户名
        read(_logPrompt);
        write(name);
        //输入密码
        read(_pwdPrompt);
        write(pwd);
        //输入终端信息
        read(_terPrompt);
        write(_terName);
        //读取可以输入命令
        read(_cmdPrompt);
    }

    public StringBuffer execCommand(String command,String endBy){
        write(command);
        return readEndBy(endBy);
    }

    /**
     * 读取流中的数据
     *
     * @param flagWords 流中是否含有该标志
     * @return String 错误则返回error,否则返回读取的字符串
     */
    public String read(String flagWords) {

        String tmp = null;
        int read ;
        byte[] buff = new byte[2048];
        flagWords = flagWords==null?"":flagWords;
        try {
            while ((read = remoteInput.read(buff))>0) {
                tmp = new String(buff,0,read);
                log.info("#" + tmp + "#");
                /*此处就是潜在的BUG,如果截取的字符串非理想化,那么这里程序将挂起,
                可以通过调整byte数组大小来解决,即确认截取一屏的字节数*/
                if (tmp.startsWith(flagWords) || tmp.indexOf(flagWords) > 0) {
                    return tmp;
                }else if(tmp.indexOf("successfully completed")>0){
                    return tmp;
                }
            }
        } catch (IOException e) {
            tmp = "error";
            e.printStackTrace();
        }

        return tmp;
    }

    /**
     * 读取流中的数据
     *
     * @param end 流中是否含有该标志
     * @return StringBuffer 错误则返回error,否则返回读取的字符串
     */
    public StringBuffer readEndBy(String end) {

        String tmp ;
        StringBuffer buffer = new StringBuffer();
        int read;
        byte[] bytes = new byte[2048];
        end = end==null?"":end;
        try {
            while (0 < (read = remoteInput.read(bytes))) {
                //替换特殊字符
                tmp = new String(bytes,0,read).replaceAll("\\u001B","");
                buffer.append(tmp);
                log.info("#" + tmp + "#");
                //此处仅适用endsWith是为了防止相同结束符存在造成的获取误差
                if (tmp.endsWith(end)) {
                    return buffer;
                }
            }
        } catch (IOException e) {
            buffer = new StringBuffer();
            buffer.append("error");
            e.printStackTrace();
        }

        return buffer;
    }

    /**
     * 关闭连接
     */
    public void close() {
        //关闭流
        if (null != remoteInput) {
            try {
                remoteInput.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (null != remoteOut) {
            remoteOut.close();
        }
        //关闭连接
        try {
            client.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 往流里写入数据
     *
     * @param msg  需要写入流的数据
     */
    public void write(String msg) {
        remoteOut.println(msg);
        remoteOut.flush();
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        TelnetUtil util = new TelnetUtil("10.11.9.*",5023,TerminalType.T_W2KTT);
        util.login("szct****", "sz****");
        StringBuffer tmp = util.execCommand("status socket-usage","[0m");
        System.out.println(tmp.toString());
        util.close();
    }
}

 

   net中自带的实例工具类,可以参考下

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.special.utils.telnet;

import java.io.IOException;
import org.apache.commons.net.telnet.TelnetClient;

import examples.util.IOUtil;

/***
 * This is an example of a trivial use of the TelnetClient class.
 * It connects to the weather server at the University of Michigan,
 * um-weather.sprl.umich.edu port 3000, and allows the user to interact
 * with the server via standard input.  You could use this example to
 * connect to any telnet server, but it is obviously not general purpose
 * because it reads from standard input a line at a time, making it
 * inconvenient for use with a remote interactive shell.  The TelnetClient
 * class used by itself is mostly intended for automating access to telnet
 * resources rather than interactive use.
 * <p>
 ***/

// This class requires the IOUtil support class!
public final class WeatherTelnet
{

    public final static void main(String[] args)
    {
        TelnetClient telnet;

        telnet = new TelnetClient();

        try
        {
//            telnet.connect("rainmaker.wunderground.com", 3000);
            telnet.connect("10.11.9.5",5023);
        }
        catch (IOException e)
        {
            e.printStackTrace();
            System.exit(1);
        }

        IOUtil.readWrite(telnet.getInputStream(), telnet.getOutputStream(),
                         System.in, System.out);

        try
        {
            telnet.disconnect();
        }
        catch (IOException e)
        {
            e.printStackTrace();
            System.exit(1);
        }

        System.exit(0);
    }

}

 

分享到:
评论

相关推荐

    远程桌面连接和telnet远程桌面

    ### 远程桌面连接与Telnet远程访问详解 #### 一、远程桌面连接概述 远程桌面连接是一种允许用户从一个位置远程控制另一台计算机的技术。它通过网络将两台计算机连接起来,使得用户可以在本地计算机上操作远程...

    远程开启telnet服务的脚本

    - **网络配置**:目标服务器必须允许远程连接,并且网络配置正确。 综上所述,这段脚本为远程开启Telnet服务提供了一种有效的方法,但在实际应用时需要注意其可能带来的安全问题。同时,对于现代网络环境而言,推荐...

    java远程进行telnet,ftp,ssh连接的方法及源代码.rar

    Java语言在IT行业中被广泛应用,尤其在网络通信和系统管理领域,它提供了丰富的库来支持远程连接功能,如telnet、ftp和ssh。本资源包"java远程进行telnet,ftp,ssh连接的方法及源代码.rar"就是针对这些功能的一个详细...

    telnet服务项目详细笔记文档实战案例

    在客户端安装远程连接 telnet 命令,并提供服务器提供的普通用户名和密码,以便远程连接登录到服务器。 Telnet 服务项目的实现需要在服务器端安装 xinetd 和 telnet-server 服务。xinetd 是一个 Unix 类操作系统上...

    telnet 客户端连接C++ 实现

    telnet 客户端的c++实现,socket模拟实现telnet 的远程连接。以及telnet 的模拟其他指令发送 接收。

    linux远程连接工具

    Linux远程连接工具主要指的是能够帮助用户通过网络在本地计算机上操控远程Linux服务器的软件。在IT行业中,这对于系统管理员、开发者以及需要频繁访问远程服务器的人员来说是必不可少的工具。本篇文章将详细介绍...

    java远程telnet ftp和ssh连接的方法

    在Java编程语言中,远程连接技术对于系统集成、自动化运维以及网络管理等场景至关重要。本文将详细介绍如何使用Java实现对远程服务器的Telnet、SSH(Secure Shell)和FTP(File Transfer Protocol)连接。 1. **...

    Telnet远程登陆实验报告

    在实验的测试阶段,需要从PC端使用Telnet客户端,输入之前设置的IP地址和端口进行连接测试。如果一切配置正确,且认证信息无误,用户便可以成功登录到交换机上,并通过命令行进行进一步的设备管理。 实验总结部分...

    IBM服务器BMC远程管理.pdf

    客户端可以在本机或远程连接TELNET服务器,使用任何标准的TELNET客户端软件。连接到服务器后,用户可以使用管理员账户和密码登录,实现服务器的远程管理和维护。 BMC远程管理提供了一种有效的服务器管理方式,能够...

    开启WIN7远程登录telnet功能方法详细图解说明

    WIN7也能使用telnet远程登录喔,你知道吗,里面有详细的开启这个功能的方法的详细介绍,一看即懂,

    在win7系统中远程连接的Telnet连接不成功问题.docx

    在win7系统中远程连接的Telnet连接不成功问题.docx

    易语言主机远程连接.rar

    "主机远程连接"在IT领域中通常指的是通过网络远程操控另一台计算机,实现对远程主机的管理和操作。在这个上下文中,"易语言主机远程连接"可能涉及到以下几个关键知识点: 1. 易语言基础:易语言的设计理念是“易学...

    远程连接 远程连接

    远程连接是一种技术,它允许用户通过互联网或其他网络访问位于不同地理位置的计算机系统或网络资源。在IT领域,远程连接广泛应用于系统管理、技术支持、协同工作和云计算服务等多个场景。本篇将深入探讨远程连接的...

    window远程连接linux服务器终端

    SecureCRT是一款强大的SSH、Telnet和 SERIAL终端模拟器,支持多种协议,如SSH1、SSH2、 Telnet、Telnet/SSH等,可以实现Windows到Linux的远程连接。SecureFX则是一个安全的文件传输客户端,支持SFTP、FTP、FTPS等...

    SimpleRemote - 免费开源的绿色单文件远程连接管理工具

    轻量级、选项卡式、免费、开源的远程连接管理工具,支持 RDP、SSH、Telnet 协议 特征: 轻量级(无过多的依赖) 绿色单文件,不到 3M (压缩后) 没有任何广告 选项卡样式,同时也支持窗口式 干净,一致的界面...

    利用telnet协议的远程登录端 论文

    Telnet协议的基本服务包括网络虚拟终端(NVT)的定义、选项协商机制,以及对称处理连接两端的能力,确保了高效、透明的远程控制体验。 #### Telnet客户端构建与实现 Telnet客户端的设计核心在于创建一个桥梁,用于...

    java-telnet连接远程服务器并执行shell命令

    java-telnet连接远程服务器并执行shell命令 具体代码 java-telnet

    FinalShell安装包,让用户通过SSH、Telnet或者RDP等协议连接到远程服务器或设备,实现远程控制和管理

    FinalShell是一款功能强大的远程终端软件,它可以让用户通过SSH、Telnet或者RDP等协议连接到远程服务器或设备,实现远程控制和管理。FinalShell支持多标签页、会话管理、命令自动补全、命令批量执行等功能,用户可以...

    linux下lrzsz安装,SecureCRT上传下载文件工具

    SecureCRT这个多标签远程登陆终端被越来越多的人接受,人们用它远程连接 telnet 或 SSH 服务。系统管理员主要用它连接 linux 服务器。  lrzsz 是一个搭配 SecureCRT 使用的上传下载工具,能将本地文件上传到远程...

    C++实现telnet代码

    Telnet(Teletype Network)是一种用于远程登录的服务协议,它允许用户通过网络连接到另一台远程计算机上,并且可以像操作本地计算机一样控制远程计算机。Telnet最初是在1969年为ARPANET开发的,后来成为Internet...

Global site tag (gtag.js) - Google Analytics