jsch
http://www.jcraft.com/jsch/
Jsch是java实现的一个SSH客户端。开发JSCH的公司是 jcraft:
JCraft成立于1998年3月,是一家致力于Java应用程序和Internet / Intranet服务的应用程序开发公司。
引入依赖:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
代码样例:
import com.jcraft.jsch.*;
import com.linkmecha.tenant.common.model.DataBase;
import com.linkmecha.tenant.common.model.SSHResult;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.io.InputStream;
/**
* @Author: jinxk
* @Date: 2023-04-03 18:36
*/
@Slf4j
@Data
public class LinuxShellOutUtil {
private static Session session;
public Boolean connectTest(DataBase dataBase) {
try {
JSch jsch = new JSch();
session = jsch.getSession(dataBase.getUserName(), dataBase.getUrl(), Integer.parseInt(dataBase.getPort()));
session.setPassword(dataBase.getPassWord());
// 设置第一次登陆的时候提示,可选值:(ask | yes | no)
session.setConfig("StrictHostKeyChecking", "no");
// 连接超时
session.connect(1000 * 10);
if (session.isConnected()) {
session.disconnect();
}
return true;
} catch (JSchException e) {
if (session.isConnected()) {
session.disconnect();
}
log.error("linux连接测试异常", e);
return false;
}
}
public SSHResult getData(DataBase dataBase, String sql) {
SSHResult result = new SSHResult();
result.setFlag(true);
try {
JSch jsch = new JSch();
session = jsch.getSession(dataBase.getUserName(), dataBase.getUrl(), Integer.parseInt(dataBase.getPort()));
session.setPassword(dataBase.getPassWord());
// 设置第一次登陆的时候提示,可选值:(ask | yes | no)
session.setConfig("StrictHostKeyChecking", "no");
// 连接超时
session.connect(10000 * 10);
byte[] tmp = new byte[1024];
byte[] btmp = new byte[1024];
// 命令返回的结果
StringBuffer successBuffer = new StringBuffer();
StringBuffer errorBuffer = new StringBuffer();
Channel channel = session.openChannel("exec");
ChannelExec exec = (ChannelExec) channel;
InputStream extInputStream = exec.getInputStream();
// 返回结果流(命令执行错误的信息通过getErrStream获取)
InputStream stdStream = exec.getErrStream();
exec.setCommand(sql);
exec.connect();
try {
while (true) {
//获取命令执行正确的返回信息
while (extInputStream.available() > 0) {
int i = extInputStream.read(btmp, 0, 1024);
if (i < 0) {
break;
}
successBuffer.append(new String(btmp, 0, i));
}
//开始获得SSH命令错误的结果
while (stdStream.available() > 0) {
int i = stdStream.read(tmp, 0, 1024);
if (i < 0) {
break;
}
errorBuffer.append(new String(tmp, 0, i));
}
if (exec.isClosed()) {
break;
}
try {
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
}
} finally {
//关闭连接
channel.disconnect();
}
//根据返回数据,组装结果
if (StringUtils.hasLength(successBuffer)) {
result.setCode("000000");
result.setMessage(successBuffer.toString());
} else if (StringUtils.hasLength(errorBuffer)) {
result.setCode("000002");
result.setMessage(errorBuffer.toString());
} else {
result.setCode("000001");
result.setMessage("");
}
} catch (Exception e) {
log.error("获取ssh执行结果异常", e);
result.setFlag(false);
result.setCode("100000");
} finally {
if (session.isConnected()) {
session.disconnect();
}
}
return result;
}
/**
* 关闭连接
*/
public static void close() {
if (session.isConnected()) {
session.disconnect();
}
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
String ip = "";
String username = "root";
String password = "";
DataBase dataBase = new DataBase(); // 连接数据类
dataBase.setUserName(username);
dataBase.setPassWord(password);
dataBase.setUrl(ip);
dataBase.setPort("22");
LinuxShellOutUtil linux = new LinuxShellOutUtil();
System.out.println(linux.getData(dataBase, "mkdir zx1"));
System.out.println(linux.getData(dataBase, "ls -l"));
}
}