通过java接口实现远程控制服务器
这里是在一个springboot项目中实现的
maven配置中增加几个引用
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
创建一个controller类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
@RestController
@RequestMapping("/system")
public class PoweroffController {
private static final Logger log = LoggerFactory.getLogger(PoweroffController.class);
private static String DEFAULTCHART = "UTF-8";
@RequestMapping("/poweroff")
public String poweroff(String ip, String userName, String userPwd, String cmd) {
// 连接主机
Connection conn = this.login(ip, userName, userPwd);
String result = this.execute(conn, cmd);
return result;
}
/**
* 登录主机
*
* @return 登录成功返回true,否则返回false
*/
public Connection login(String ip, String userName, String userPwd) {
boolean flg = false;
Connection conn = null;
try {
conn = new Connection(ip);
conn.connect();// 连接
flg = conn.authenticateWithPassword(userName, userPwd);// 认证
if (flg) {
log.info("=========登录成功=========" + conn);
return conn;
}
} catch (IOException e) {
log.error("=========登录失败=========" + e.getMessage());
e.printStackTrace();
}
return conn;
}
/**
* 远程执行shll脚本或者命令
*
* @param cmd 即将执行的命令
* @return 命令执行完后返回的结果值
*/
public String execute(Connection conn, String cmd) {
String result = "";
try {
if (conn != null) {
Session session = conn.openSession();// 打开一个会话
session.execCommand(cmd);// 执行命令
result = processStdout(session.getStdout(), DEFAULTCHART);
// 如果为得到标准输出为空,说明脚本执行出错了
if (StringUtils.isBlank(result)) {
log.info("得到标准输出为空,链接conn:" + conn + ",执行的命令:" + cmd);
result = processStdout(session.getStderr(), DEFAULTCHART);
} else {
log.info("执行命令成功,链接conn:" + conn + ",执行的命令:" + cmd);
}
conn.close();
session.close();
}
} catch (IOException e) {
log.info("执行命令失败,链接conn:" + conn + ",执行的命令:" + cmd + " " + e.getMessage());
e.printStackTrace();
}
return result;
}
/**
* 解析脚本执行返回的结果集
*
* @param in 输入流对象
* @param charset 编码
* @return 以纯文本的格式返回
*/
private String processStdout(InputStream in, String charset) {
InputStream stdout = new StreamGobbler(in);
StringBuffer buffer = new StringBuffer();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
String line = null;
while ((line = br.readLine()) != null) {
buffer.append(line + "\n");
}
} catch (UnsupportedEncodingException e) {
log.error("解析脚本出错:" + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
log.error("解析脚本出错:" + e.getMessage());
e.printStackTrace();
}
return buffer.toString();
}
}
这就可以了, 足够了
之所以需要配置ip,username,userpwd这几个字段, 主要是为了灵活, 如果在代码中固定设置了ip, 那么只能操作一个服务器, 这样动态的ip地址, 让用户可以尽可能多的操作服务器