package com.telnet;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.net.SocketException;
import org.apache.commons.net.telnet.TelnetClient;
public class WindowsShell {
private TelnetClient telnet = new TelnetClient("VT220");
InputStream in;
PrintStream out;
String prompt = ">";
public WindowsShell(String ip, int port, String user, String password) {
try {
telnet.connect(ip, port);
in = telnet.getInputStream();
out = new PrintStream(telnet.getOutputStream());
login(user, password);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 登录
*
* @param user
* @param password
*/
public void login(String user, String password) {
// read()Until("login:");
readUntil("login:");
write(user);
readUntil("password:");
write(password);
readUntil(prompt + "");
}
/**
* 读取分析结果
*
* @param pattern
* @return
*/
public String readUntil(String pattern) {
try {
char lastChar = pattern.charAt(pattern.length() - 1);
StringBuffer sb = new StringBuffer();
char ch = (char) in.read();
while (true) {
sb.append(ch);
if (ch == lastChar) {
if (sb.toString().endsWith(pattern)) {
return sb.toString();
}
}
ch = (char) in.read();
// System.out.print(ch);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 写操作
*
* @param value
*/
public void write(String value) {
try {
out.println(value);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 向目标发送命令字符串
*
* @param command
* @return
*/
public String sendCommand(String command) {
try {
write(command);
return readUntil(prompt + "");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 关闭连接
*/
public void disconnect() {
try {
telnet.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws UnsupportedEncodingException {
WindowsShell ws = new WindowsShell("127.0.0.1", 23, "Administrator", "123");
// System.out.println(ws);
// 执行的命令
String str = ws.sendCommand("ipconfig");
str = new String(str.getBytes("ISO-8859-1"),"GBK");
System.out.println(str);
ws.disconnect();
}
}
此处需要导入: commons-net-3.3.jar
例子发送命令为:ipconfig。
返回结果如下图:
----------------------------------------------------------------------------------------------------------------------------------------
补充一:
做该功能时,客户那里使用的是oracle12, 连接数据库的方式需要使用OCI。之前一直都使用thin方式, oci第一次使用,可以说是一步一个坎。
从网上查找了一下资料:oci方式,客户端通过native java method调用c library访问服务端,而这个c library就是oci(oracle called interface),因此这个oci总是需要随着oracle客户端安装(从oracle10.1.0开始,单独提供OCI Instant Client,不用再完整的安装client)。
1.先从oracle官网下载oracle12客户端。
2.安装客户端。
3.创建一个本地服务。
4.关键来了: java代码里面的书写方式
Connection connection = DriverManager.getConnection("jdbc:oracle:oci8:wwj/wwj123@nets");
其中 wwj/wwj123 为用户名密码,nets为本地服务名。
也算是一个知识点, 记录下来,给分享给有需要的小伙伴及自己。
-----------------------------------------------------------------------------------------------------------------------------------------
补充二:
在java实现发送telnet功能发送命令时,有的命令执行后会让你输入确认命令 y/n 。
此时如果直接发送 she.sendCommand("y"); 再发送一次回车she.sendCommand("\r\n"); 此时会返回错误信息
y ^ % Unknown command, the error locates at '^'
从网上找也没有找到类似的问题,我就自己尝试,最终还真让我试出来了 she.sendCommand("\r\ny\r\n");