1. 程式人生 > >java通過telnet遠程至windows機器執行dos命令

java通過telnet遠程至windows機器執行dos命令

功能說明 用戶名 time ted clas cte flag author enc

準備工作,遠程windows機器中開啟telnet服務,將遠程登錄用戶添加至telnetClients用戶組

核心代碼:

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import org.apache.commons.net.telnet.TelnetClient;
import org.testng.annotations.Test;

/**
*
* @author zhuwei
*
*/
public class TelnetUtils {

/**
* 結束標識字符串,Windows中是>,Linux中是#
*/
private String prompt = ">";

/**
* 結束標識字符
*/
private char promptChar = ‘>‘;

/**
* TelnetClient對象
*/
private TelnetClient telnet;

/**
* InputStream 輸入流,接收返回信息
*/
private InputStream in;

/**
* PrintStream 向服務器寫入 命令
*/
private PrintStream out;

/**
* 構造函數
* @param termtype
* @param prompt
*/
public TelnetUtils(String termtype,String prompt){
this.telnet = new TelnetClient(termtype);
setPrompt(prompt);
}

/**
* 構造函數
* @param termtype
*/
public TelnetUtils(String termtype){
this.telnet = new TelnetClient(termtype);
}

/**
* 構造函數
*/
public TelnetUtils(){
telnet = new TelnetClient();
}

/**
* 登錄到目標主機
* @param ip Ip地址
* @param port 端口號
* @param username 用戶名
* @param password 密碼
*/
public void login(String ip, int port, String username, String password){
try {
telnet.connect(ip, port);
in = telnet.getInputStream();
out = new PrintStream(telnet.getOutputStream());
readUntil("login:");
write(username);
readUntil("password:");
write(password);
String rs = readUntil(null);
if(rs!=null&&rs.contains("Login Failed")){
throw new RuntimeException("登錄失敗");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}

/**
* 讀取分析結果
* @param pattern 匹配到該字符串時返回結果
* @return String
*/
public String readUntil(String pattern) {
StringBuffer sb = new StringBuffer();
try {
char lastChar = (char)-1;
boolean flag = pattern!=null&&pattern.length()>0;
if(flag)
lastChar = pattern.charAt(pattern.length() - 1);
char ch;
int code = -1;
while ((code = in.read()) != -1) {
ch = (char)code;
sb.append(ch);
//匹配到結束標識時返回結果
if (flag) {
if (ch == lastChar && sb.toString().endsWith(pattern)) {
return sb.toString();
}
}else{
//如果沒指定結束標識,匹配到默認結束標識字符時返回結果
if(ch == promptChar)
return sb.toString();
}
//登錄失敗時返回結果
if(sb.toString().contains("Login Failed")){
return sb.toString();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}

/**
* 發送命令
* @param value
*/
public void write(String value) {
try {
out.println(value);
out.flush();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
*
*功能說明:發送命令,返回執行結果
*
*輸入參數:command telnet命令
*
*輸出參數:String 命令執行結果
* @throws UnsupportedEncodingException
*
*
*/
public String sendCommand(String command) throws UnsupportedEncodingException {
try {
write(command);
//return readUntil(prompt);
} catch (Exception e) {
e.printStackTrace();
}
//將返回結果轉碼為gbk,否則會亂碼
String serverResult = new String(readUntil(prompt).getBytes("ISO-8859-1"),"GBK") ;
return serverResult;
}

/**
*功能說明:關閉telnet連接
*
*輸入參數:
*
*輸出參數:
*/
public void distinct(){
try {
if(telnet!=null&&!telnet.isConnected())
telnet.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
*功能說明:設置結束標識符
*
*輸入參數:prompt 結束標識符
*
*輸出參數:
*
*/
public void setPrompt(String prompt) {
if(prompt!=null){
this.prompt = prompt;
this.promptChar = prompt.charAt(prompt.length()-1);
}
}

/**
*功能說明:測試函數
*
*輸入參數:args
*
*輸出參數:
* @throws UnsupportedEncodingException
*/

public String excuteWinCmd(String remoteHost,String port,String userName,String passWord,String winCmd) throws UnsupportedEncodingException{
login(remoteHost, Integer.valueOf(port), userName, passWord);
String serverResult = sendCommand(winCmd);
distinct();
return serverResult;
}

@Test
public void test1() throws UnsupportedEncodingException{

//Windows,用VT220,否則會亂碼
TelnetUtils telnetUtils = new TelnetUtils("VT220",">");
String result = telnetUtils.excuteWinCmd("172.19.21.216", "23", "xxxx", "xxxx","taskkill /f /t /IM chrome.exe");
System.out.println(result);
}
}

java通過telnet遠程至windows機器執行dos命令