import java.io.Serializable;
/**
* shell脚本执行结果
* 先通过getSuccess方法判断命令是否执行成功
* 执行成功的时候采用result作为返回值
* 执行不成功采用errorOut作为返回值
*/
public class ShellResult implements Serializable {
private static final long serialVersionUID = -110281463872334425L;
/** 脚本输出结果 */
private String result;
/** 异常输出结果 */
private String errorMsg;
/** 回话退出状态 */
private int exitStatus;
public ShellResult() {
}
public ShellResult(String result, String errorOut, int exitStatus) {
this.result = result.trim();
this.errorMsg = errorOut.trim();
this.exitStatus = exitStatus;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result.trim();
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg.trim();
}
public int getExitStatus() {
return exitStatus;
}
public void setExitStatus(int exitStatus) {
this.exitStatus = exitStatus;
}
/** 是否成功关闭会话 */
public boolean getSuccess() {
return this.exitStatus == 0;
}
}
import ch.ethz.ssh2.ChannelCondition;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
public class GanymedUtils {
private static final Logger logger = LoggerFactory.getLogger(GanymedUtils.class);
/** 超时时间 */
private static final int TIME_OUT = 1000 * 5 * 60;
/**
* 登录远端服务器
*
* @param ip 主机地址
* @param userName 用户名
* @param password 密码
* @return 当前的连接
* @throws IOException
*/
public static Connection login(String ip, String userName, String password) throws IOException {
Connection connection = new Connection(ip);
connection.connect();
return connection.authenticateWithPassword(userName, password) ? connection : null;
}
/**
* 执行一个命令
*
* @param ip 主机ip
* @param userName 用户名
* @param password 密码
* @param scripts 需要执行的脚本
* @param charset 字符编码
* @return ShellResult类
* @throws Exception
*/
public static ShellResult exec(String ip, String userName, String password, String scripts, Charset charset) throws IOException {
Connection connection = login(ip, userName, password);
if (connection == null) {
throw new RuntimeException("登录远程服务器出现异常,ip为:" + ip);
}
// Open a new {@link Session} on this connection
Session session = connection.openSession();
try (
InputStream stdOut = new StreamGobbler(session.getStdout());
InputStream stdErr = new StreamGobbler(session.getStderr())
) {
// Execute a command on the remote machine.
//session.execCommand(scripts);//不太优秀
session.requestPTY("bash");
session.startShell();
// 准备输入命令
PrintWriter out = new PrintWriter(session.getStdin());
// 输入待执行命令
out.println(scripts);
out.println("pwd");
out.println("exit");//目前来一定要执行
// 6. 关闭输入流
out.close();
// 7. 等待,除非1.连接关闭;2.输出数据传送完毕;3.进程状态为退出;4.超时
session.waitForCondition(ChannelCondition.CLOSED | ChannelCondition.EOF | ChannelCondition.EXIT_STATUS , 30000);
// InputStream stderr = new StreamGobbler(session.getStderr());
// InputStream in = new StreamGobbler(session.getStdout());
String outStr = processStream(stdOut, charset.name());
String outErr = processStream(stdErr, charset.name());
session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);
int exitStatus = session.getExitStatus();
return new ShellResult(outStr, outErr, exitStatus);
}
}
/**
* 执行脚本
*
* @param in 输入流
* @param charset 字符编码
* @return
* @throws IOException
*/
private static String processStream(InputStream in, String charset) throws IOException {
byte[] buf = new byte[1024];
StringBuilder sb = new StringBuilder();
while (in.read(buf) != -1) {
sb.append(new String(buf, charset));
}
return sb.toString();
}
//ip:"000.00.00.00"
//username:"username"
//password:"password"
public static void main(String[] args) {
String ls = "cd /home/";
try {
ShellResult status = exec("000.00.00.00", "username", "password", ls, StandardCharsets.UTF_8);
System.out.println(">>>>>>Result>>>>>>>");
System.out.println(status.getResult());
//ShellResult status = exec("192.168.183.145", "root", "sunway123", "lsof -i:8002", StandardCharsets.UTF_8);
/*System.out.println(">>>>>>Result>>>>>>>");
System.out.println(status.getResult());
String pidStr = status.getResult().split("\n")[1];
String value[] = pidStr.split(" ");
for (String str:value) {
if(StringUtils.isNotEmpty(str)&&StringUtils.isNumber(str)){
int pid = StringUtils.parseInt(str);
ShellResult killstatus = exec("000.000.000.000", "user", "password", "kill -9 "+pid, StandardCharsets.UTF_8);
System.out.println(">>>>>>Result>>>>>>>");
System.out.println(killstatus.getResult());
break;
}
}*/
System.out.println(">>>>>>ErrorMsg>>>>>>>>");
System.out.println(status.getErrorMsg());
} catch (IOException e) {
e.printStackTrace();
}
}
}
main方法运行结果: