java使用telnet连接远程计算机执行命令
2015-07-28 11:18
141 查看
所需的jar包 http://commons.apache.org/proper/commons-net/
如题,代码如下:
如题,代码如下:
package securecrt.ssh2; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.net.SocketException; import java.util.ArrayList; import java.util.List; import org.apache.commons.net.telnet.TelnetClient; /** * * 使用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.1.jar), ganymed(ganymed-ssh2-build210.jar),javaexpect(smart-0.1-SNAPSHOT-jar-with-dependencies.jar) 我使用appache。javaexpect有带的vt100控制码过滤,我没有仔细研究。 6.write要flush()才发送。 * * * telnet操作类。使用appache的net.Telnet包,对vt100控制代码(即ansi控制码)进行简单过滤。 * * @author chruan * @version 1.0 */ public class TelnetHelper_bak { Object lock = new Object(); TelnetClient telnet = null; String hostname; int hostport = 23; String user; String password; private InputStream in; private PrintStream out; private static final String ORIG_CODEC = "ISO8859-1"; private static final String TRANSLATE_CODEC = "GBK"; public TelnetHelper_bak(String hostname, int hostport, String user, String password) throws SocketException, IOException { super(); this.hostname = hostname; this.hostport = hostport; this.user = user; this.password = password; telnet = new TelnetClient("VT100");// VT100 VT52 VT220 VTNT ANSI telnet.connect(hostname, hostport); in = telnet.getInputStream(); out = new PrintStream(telnet.getOutputStream()); readUntil("login: "); write(user); write("\n"); readUntil("Password: "); write(password); write("\n"); } private void restartTerminal() { try { readUntil(">"); write("telnet 0.0.7.74\n"); readUntil("login: "); write("dd\n", 500); readToEnd(); write("dff\n", 200); readToEnd(); } catch (Exception e) { e.printStackTrace(); } finally { } } public void readToEnd() { ReadThread readThread = new ReadThread(); readThread.start(); try { readThread.join(); } catch (Exception e) { } readThread = null; } public void readUntil(String str) { char last = str.charAt(str.length() - 1); String[] ss; try { StringBuffer sb = new StringBuffer(); char c; int code = -1; boolean ansiControl = false; boolean start = true; while ((code = (in.read())) != -1) { c = (char) code; if (c == '\033') {//vt100控制码都是以\033开头的。 ansiControl = true; int code2 = in.read(); char cc = (char) code2; if (cc == '[' || cc == '(') { } } if (!ansiControl) { if (c == '\r') { //这里是命令行中的每一句反馈 String olds = new String(sb.toString().getBytes( ORIG_CODEC), TRANSLATE_CODEC); System.out.println(olds); if (sb.lastIndexOf(str) != -1) { break; } sb.delete(0, sb.length()); } else if (c == '\n') ; else sb.append(c); if (sb.lastIndexOf(str) != -1) { break; } } if (ansiControl) { if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '"') { ansiControl = false; } } } System.out.println(new String(sb.toString().getBytes(ORIG_CODEC), TRANSLATE_CODEC)); } catch (Exception e) { e.printStackTrace(); } } public void write(String s) { try { out.write(s.getBytes()); out.flush(); System.out.println(s); } catch (Exception e) { } } public void write(String s, int sleep) { write(s); try { Thread.sleep(sleep); } catch (Exception e) { } } /** * 完成之后必须关闭 */ public void close() { if (out != null) out.close(); if (in != null) try { in.close(); } catch (IOException e1) { } if (telnet != null) try { telnet.disconnect(); } catch (IOException e) { } } public void doJob() { // restartTerminal(); counter(); } private void counter() { //演示在一台机器上远程登录另一台计算机 try { readUntil("bash-2.05b$ "); write("ssh loc@192.168.0.1\n"); readUntil("loc@192.168.0.1's password: "); write("nodee\n"); readUntil("[nodee@dz-05 ~]$ "); write("ll\n"); readToEnd(); } catch (Exception e) { e.printStackTrace(); } finally { } } public static void main(String[] args) { String hostname = "192.168.0.2"; int hostport = 23; String user = "username"; String password = "pwd"; TelnetHelper_bak helper = null; try { helper = new TelnetHelper_bak(hostname, hostport, user, password); helper.doJob(); } catch (Exception e) { e.printStackTrace(); } finally { if (helper != null) helper.close(); } } /** * 读取主线程,负责管理子线程。防止读取时不动了,这时就抛弃读取子线程 * */ class ReadThread extends Thread { public void run() { synchronized (lock) {//只能一个读取 SubReadThread sub = new SubReadThread(); sub.start(); int last = sub.count; while (true) { try { Thread.sleep(100); } catch (InterruptedException e) { } if (last == sub.count) { sub.stop(); break; } else { last = sub.count; } } String s = sub.sb.toString(); try { System.out.println(new String(s.getBytes(ORIG_CODEC), TRANSLATE_CODEC)); } catch (UnsupportedEncodingException e) { System.out.println(s); } sub = null; } // System.out.println("===========ReadThread end============="); } } /** * 读取子线程,完成实际读取 * */ class SubReadThread extends Thread { int count = 0; StringBuffer sb = new StringBuffer(); public void read() { try { char c; int code = -1; boolean ansiControl = false; boolean start = true; while ((code = (in.read())) != -1) { count++; c = (char) code; if (c == '\033') { ansiControl = true; int code2 = in.read(); char cc = (char) code2; count++; if (cc == '[' || cc == '(') { } } if (!ansiControl) { if (c == '\r') { String olds = new String(sb.toString().getBytes( ORIG_CODEC), TRANSLATE_CODEC); System.out.println(olds); sb.delete(0, sb.length()); } else if (c == '\n') ; else sb.append(c); } if (ansiControl) { if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '"') { ansiControl = false; } } } } catch (Exception e) { } } public void run() { read(); } } }
相关文章推荐
- 步步为营(十一)常用数据结构(4)STL-Map(应该是散列表)
- [转]Internet Explorer已限制此网页运行可以访问计算机的脚本或ActiveX控件
- python实现单隐层神经网络基本模型 推荐
- 网络编程系列之二 互斥量
- tomcat7 服务器配置HTTPS安全协议
- 网络爬虫基本原理(一)
- 网络爬虫基本原理二
- 1149-PIGS(网络流建模,缩点)
- 自组织神经网络的实现
- Nmap新增脚本http-svn-enum和http-svn-info
- 数据结构基础 查找 之 二分查找
- Linux网络编程select模型的实现
- ProtoBuf
- 计算机中内存、cache和寄存器之间的关系及区别
- 南阳oj 士兵杀敌(三) 题目119 数据结构
- 数据结构
- 步步为营(十)常用数据结构(3)STL-Deque(双端队列)
- https 对接非对称密钥加密 MD5及数字签名相关
- TCP and UDP Small Servers
- 【iOS】MD5加密与网络数据安全