依赖的jar包
<!-- linux ssh -->
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
子定义一个结果类,也可以用map代替
import java.io.Serializable;
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 LinuxUtils {
private static final Logger logger = LoggerFactory.getLogger(LinuxUtils .class);
private static final int TIME_OUT = 1000 * 5 * 60;
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;
}
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);
}
Session session = connection.openSession();
try (
InputStream stdOut = new StreamGobbler(session.getStdout());
InputStream stdErr = new StreamGobbler(session.getStderr())
) {
session.requestPTY("bash");
session.startShell();
PrintWriter out = new PrintWriter(session.getStdin());
out.println(scripts);
out.println("nohup java -cp XXXX.jar cn.com.XXX.Main > XXX.log &");
out.println("exit");
out.close();
session.waitForCondition(ChannelCondition.CLOSED | ChannelCondition.EOF | ChannelCondition.EXIT_STATUS , 30000);
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);
}
}
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();
}
public static void main(String[] args) {
String orderStr = "pwd";
try {
ShellResult status = exec("192.168.000.000", "username", "password", orderStr, StandardCharsets.UTF_8);
System.out.println(">>>>>>Success_Result>>>>>>>");
System.out.println(status.getResult());
System.out.println(">>>>>>Error_Msg>>>>>>>>");
System.out.println(status.getErrorMsg());
} catch (IOException e) {
e.printStackTrace();
}
}
}