Java编写Telnet客户端,连接到Windows的Telnet服务器,执行命令和批处理脚本,同时解决了中文乱码的问题。

源代码和Jar包在这里下载:http://download.csdn.net/detail/kerafan/9327585

引入的Jar包:Apache common-net-3.3.jar

工具类代码如下:

package util.telnet;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;import org.apache.commons.net.telnet.TelnetClient;/*** Telnet 客户端,用于连接Windows的Telnet服务器* * @author Lijinsheng* * @since 2015-12-04**/
public class WindowsTelnetClient {/** Telnet服务器返回的字符集 */private static final String SRC_CHARSET = "ISO8859-1";/** 转换后的字符集 */private static final String DEST_CHARSET = "GBK";/*** 终端类型。包括以下类型:VT102、VT100、VT220、WYSE50、WYSE60、XTERM、SCOANSI、ANSI、LINUX、* VSHELL几种。经测试,对于Windows的Telnet服务器,只有VT100、ANSI类型会造成中文乱码*/private static final String TERM_TYPE = "VT220";private TelnetClient client = new TelnetClient(TERM_TYPE);// Telnet客户端private InputStream input; // Telnet输入流,用于获取Telnet服务器的返回信息private OutputStream output; // Telnet输出流,用于向服务器发送命令private String hostname; // IP地址或主机名private int port = 23; // 端口。默认为23private String username; // 用户名private String password; // 密码private String prompt; // 命令提示符,用于判断是否读取到了返回信息的结尾/*** 创建Telnet客户端,用于连接Windows的Telnet服务器。使用默认端口:23* * @param hostname*            - IP地址,或主机名* @param username*            - 用户名* @param password*            - 密码*/public WindowsTelnetClient(String hostname, String username, String password) {this.hostname = hostname;this.username = username;this.password = password;}/*** 创建Telnet客户端,用于连接Windows的Telnet服务器* * @param hostname*            - IP地址,或主机名* @param port*            - 端口* @param username*            - 用户名* @param password*            - 密码*/public WindowsTelnetClient(String hostname, int port, String username, String password) {this.hostname = hostname;this.port = port;this.username = username;this.password = password;}/*** 连接到Telnet服务器* * @return - Telnet服务器的返回信息。截止到password:* @throws SocketException* @throws IOException*/public String connect() throws SocketException, IOException {client.connect(hostname, port);input = client.getInputStream();output = client.getOutputStream();// 因为不知道服务器返回的是Login: 还是 login: ,所以忽略lString loginOutput = readTo("ogin: ");output.write((username + "\r\n").getBytes());output.flush();// 因为不知道服务器返回的是Password: 还是 password: ,所以忽略pString passwordOutput = readTo("assword: ");output.write((password + "\r\n").getBytes());output.flush();String promptOutput = readTo(">");// 取倒数4位字符作为提示符,因为提示符最短为4位,如:C:\>prompt = promptOutput.substring(promptOutput.length() - 4);return loginOutput + passwordOutput + password + promptOutput;}/*** 向Telnet服务器发送命令* * @param command*            - 命令* @return - 执行命令后,在命令行输出的信息* @throws IOException*/public String sendCommand(String command) throws IOException {output.write(command.getBytes());output.write('\r');output.write('\n');output.flush();return readToPrompt();}/*** 断开连接* * @return - 断开连接的命令*/public String disconnect() {try {input.close();output.close();client.disconnect();} catch (Exception e) {}return "exit";}/*** 读取后指定的字符处* * @param end*            - 指定的字符* @return - 从上次读取的位置,到<code>end</code>位置的输出内容*/private String readTo(String end) {StringBuffer sb = new StringBuffer();char endChar = end.charAt(end.length() - 1);char chr;try {while (true) {chr = (char) input.read();sb.append(chr);if (chr == endChar && sb.toString().endsWith(end)) {return new String(sb.toString().getBytes(SRC_CHARSET), DEST_CHARSET); // 编码转换,解决中文乱码问题}}} catch (IOException e) {e.printStackTrace();}return "";}/*** 读取后命令提示符* * @return - 从上次读取的位置,到命令提示符的输出内容*/private String readToPrompt() {return readTo(prompt);}}

测试类的代码如下:

package util.telnet;public class ClientTest {public static void main(String[] args) throws Exception {String hostname = "localhost"; // or:127.0.0.1int port = 23;String username = "Lijinsheng";String password = "abc123";WindowsTelnetClient client = new WindowsTelnetClient(hostname, port, username, password);System.out.print(client.connect());System.out.print(client.sendCommand("dir")); // 执行windows命令System.out.print(client.sendCommand("D:\\Temp\\bat\\demo.bat abc123")); // 执行批处理脚本System.out.print(client.disconnect());}}

输出结果如下:

Welcome to Microsoft Telnet Service login: Lijinshengpassword: abc123*===============================================================
Microsoft Telnet Server.
*===============================================================
C:\Users\Administrator>dir驱动器 C 中的卷没有标签。卷的序列号是 ACA6-9BB8C:\Users\Administrator 的目录2015-11-22  15:02    <DIR>          .
2015-11-22  15:02    <DIR>          ..
2015-11-29  15:11    <DIR>          .android
2015-08-04  16:14    <DIR>          .FontForge
2015-10-15  19:36    <DIR>          .IdeaIC14
2015-11-22  15:09    <DIR>          .idlerc
2014-10-26  18:02    <DIR>          .jmc
2015-07-07  23:06    <DIR>          .julia
2015-10-28  11:41    <DIR>          .kettle
2015-08-25  10:27    <DIR>          .pentaho
2015-08-25  10:26    <DIR>          .swt
2014-11-08  22:54    <DIR>          CMB
2014-10-22  15:45    <DIR>          Contacts
2015-12-04  17:40    <DIR>          Desktop
2015-11-26  22:33    <DIR>          Documents
2015-02-06  22:12    <DIR>          Downloads
2015-06-23  20:23    <DIR>          Favorites
2015-03-18  11:56    <DIR>          Links
2014-10-22  15:45    <DIR>          Music
2014-10-29  10:35    <DIR>          Oracle
2014-12-11  12:31    <DIR>          Pictures
2014-10-22  15:45    <DIR>          Saved Games
2014-10-30  22:36    <DIR>          Searches
2015-06-07  20:52    <DIR>          Videos
2015-10-28  15:35             1,151 桌面 - 快捷方式.lnk1 个文件          1,151 字节24 个目录 88,712,892,416 可用字节C:\Users\Administrator>D:\Temp\bat\demo.bat abc123
OUT1=abc123
ERROR_CODE=0
ERROR_MSG=SUCCESS..
OUT2=12.345
OUT3=ABC123
OUT4=2015-12-13C:\Users\Administrator>exit

【Java】Java编写Telnet客户端,连接到Windows的Telnet服务器,执行命令和批处理脚本相关推荐

  1. windows修改策略后执行命令_Windows 下的提权大合集

    Windows 下的提权大合集 项目地址:https://github.com/lyshark/Windows-exploits Windows平台提权漏洞集合 项目地址:https://github ...

  2. windows开机自启执行命令

    1.准备可执行的jar包(jar包的配置文件可以抽离出来和jar包平级,优先执行平级的配置文件) 2新建run.txt文本文件(输入以下命令------>改名为run.bat,这个时候启动run ...

  3. app抢购脚本如何编写_如何用1个记事本文件征服全世界?——cmd批处理脚本编写...

    电脑可以定时帮你自动处理一些重复的事务.一键实现别人多键才能实现的功能,利用常用的cmd命令可以完成这些功能,这次我们从操作层面聊一聊,如何利用这些cmd命令在记事本中编写脚本,进而实现任何自己想实现 ...

  4. windows系统 方便处理数据的bat批处理脚本(个人记录)

    windows 10 准备好数据文件output.out 数据格式为: loading from saved model ./results/contrast_acdc_pcl_temp01_thre ...

  5. windows2008 使用windows server backup定时备份文件夹和批处理脚本定时删除文件夹

    由于公司OA需要定期备份数据库文件,及定时删除超过7天的备份文件,通过windows2008自带的windows Server Backup 备份文件夹,及forfile 来定时删除超过时间的文件 由 ...

  6. Windows域控服务器查询命令

    根据Windows版本不同,命令有所不同. 查本机用户表 net user 查本机管理员 net localhroup administrators 查域管理用户 net group "do ...

  7. windows连接linux服务器并后台运行python脚本

    将本地文件上传linux服务器: D:\Program Files\PuTTY>pscp D:\python\pythonwork\jobui\rpxcorp.py root@47.104.10 ...

  8. 用Telnet客户端调试TCPSocket程序

    以前经常用Telnet去水木,一直以为Telnet是一个字一个字的发送,估计协议挺复杂.嗯,现在也没有认真看看相关的RFC,所以Telnet的协议我还是不甚了解,但是最近写程序时被高人指点用Telne ...

  9. Android与EPS8266模块通信(一)编写Android客户端

    Android与EPS8266模块通信(一)编写Android客户端 开发环境 Windows 10 Android Studio 2021.2.1 编写布局文件,这里需要两个按钮,一个按钮用来连接e ...

最新文章

  1. PIE SDK热力图
  2. 北大计算机考研考什么时候,北大计算机考研复习计划有哪些
  3. hdu1542 线段树扫描线求矩形面积的并
  4. 【大学课程】高数基础知识点
  5. 尝试修改源码需要用到git存一下
  6. 组态王 6.55 启停plc_永宏PLC在远程控制系统中的应用
  7. 【LeetCode笔记】253. 会议室 II(Java、偏数学)
  8. 【LeetCode笔记】剑指 Offer 15-. 二进制中1的个数 (Java、位运算)
  9. 被文献坑是一种什么样的体验?
  10. Python中的Series和DataFrame
  11. python能做什么工作-学完python能从事什么工作?
  12. 深入搜索引擎的关键——索引
  13. php的链接查询,php – 使用指向另一个查询的链接运行查询.
  14. python斐波那契数列_python3实现斐波那契数列(4种方法)
  15. 【TWVRP】基于matlab遗传算法求解多车场带时间窗的车辆路径规划问题【含Matlab源码 1035期】
  16. python爬虫技术作用_大数据爬虫技术有什么功能
  17. 各地的磁倾角_全国各地区地磁场强度表
  18. 数字电视加密技术工作原理(EMM ECM)
  19. Python3实现两个Excel文件内容比对
  20. 视频教程-【国内首套H3C V7交换机实战课程-1】Comware V7使用、维护与管理-H3C认证

热门文章

  1. 公司新设备戴尔R730服务器配置Raid阵列
  2. unity中第三人称游戏摄像头遮挡的处理
  3. 基于PyTorch+LSTM实现共享单车需求预测
  4. 数据挖掘4---朴素贝叶斯算法
  5. 视频截图方法 javacv
  6. 华为手机上的网上邻居怎么用_你的华为手机也可以通过PC网络共享(网上邻居)访问手机文件...
  7. BBB(二):Windows或Ubuntu主机通过USB分享网络给BBB
  8. 2020年山东事业单位都考什么?(山东事业编)
  9. Magento 2 bitnami 刷新/添加/更新 模块 模板 加修复 Magento 目录 文件 权限 命令
  10. 芯片破壁者(一):从电子管到晶体管“奇迹”寻踪