Java使用telnet连接远程计算机执行命令
所需的jar包
如题,代码如下:
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;
}
}