这里使用到的java库是JSCH
JSCH 是一个纯 Java 的库,用于通过 SSH 协议连接到远程服务器并执行命令、传输文件等操作。它是由 JCraft 提供的开源库,常用于实现自动化管理服务器、远程文件传输等功能。常见的应用场景包括:
- 执行远程命令:可以通过 SSH 连接到远程服务器并执行命令行操作。
- 文件传输:支持通过 SFTP 或 SCP 协议进行文件上传和下载。
- 端口转发:实现本地端口与远程端口之间的转发。
JSCH 使用时需要提供 SSH 登录所需的主机地址、用户名、密码或私钥等信息。
使用到的Maven依赖:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
1. 封装工具类
这里根据自己的需要简单的封装了一下, 但基本是通用的,
如下:两个方法:
- customCommand 通用方法, 参数为 配置项 和 指令
- mvFile 移动文件的方法
注: 需要注意文件的操作权限
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* @Author Cookie
* @Date 2024/9/6
* @Desc
*/
@Slf4j
public class LinuxUtil {
/**
* 移动文件位置/修改文件名称
*
* @param jSchConfig ssh地址
* @param sourceFile 源文件
* @param targetFile 目标文件
*/
public static String mvFile(JSchConfig jSchConfig, String sourceFile, String targetFile) throws JSchException, IOException {
Session session = getSession(jSchConfig);
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
String command = "sudo mv " + sourceFile + " " + targetFile;
log.info("执行移动命令: {}", command);
channelExec.setCommand(command);
// 捕获命令输出
InputStream inputStream = channelExec.getInputStream();
channelExec.connect();
// 读取输出
StringBuilder outputBuffer = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
// 读取标准输出
while ((line = reader.readLine()) != null) {
outputBuffer.append(line).append("\n");
}
} catch (Exception e) {
log.error("读取命令执行结果时出错: ", e);
}
// 等待命令执行完成
channelExec.disconnect();
session.disconnect();
// 返回命令输出结果,如果存在错误,则返回错误信息
return outputBuffer.toString();
}
/**
* 指定自定义命令
*
* @param jSchConfig 配置信息
* @param customCommand 自定义命令
*/
public static String customCommand(JSchConfig jSchConfig, String customCommand) throws JSchException, IOException {
Session session = getSession(jSchConfig);
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
channelExec.setCommand(customCommand);
// 捕获命令的标准输出
InputStream inputStream = channelExec.getInputStream();
// 捕获命令的错误输出
InputStream errStream = channelExec.getErrStream();
channelExec.connect();
log.info("执行命令: {}", customCommand);
// 创建线程来处理命令的输出
StringBuilder outputBuffer = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
outputBuffer.append(line).append("\n");
}
} catch (Exception e) {
log.error("读取命令执行结果时出错: ", e);
}
// 等待命令执行完成
channelExec.disconnect();
session.disconnect();
// 返回命令输出结果
return outputBuffer.toString() ;
}
private static @NotNull Session getSession(JSchConfig jSchConfig) throws JSchException {
JSch jsch = new JSch();
Session session = jsch.getSession(jSchConfig.getSshUser(), jSchConfig.getSshHost(), jSchConfig.getSshPort());
session.setPassword(jSchConfig.getSshPass());
session.setTimeout(jSchConfig.getTimeout());
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
return session;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class JSchConfig {
/**
* ssh地址
*/
String sshHost;
/**
* 端口
*/
int sshPort;
/**
* 用户名
*/
String sshUser;
/**
* 密码
*/
String sshPass;
/**
* 超时时间
*/
int timeout;
}
}
2. 测试:
// 读取配置文件获取配置信息
LinuxUtil.JSchConfig jSchConfig = LinuxUtil.JSchConfig.builder()
.sshHost(ssh32Host)
.sshPort(ssh32Port)
.sshUser(ssh32Username)
.sshPass(ssh32Password)
.timeout(1000)
.build();
// 执行系统中的自定义指令
String rmSh = "sudo rm -rf / " + requestVideoUrl;
String rmResult = LinuxUtil.customCommand(jSchConfig, rmSh);
log.info("删除结果 {}", rmResult);
// 移动文件测试
String sourcePath = "/data/output.jpg";
String targetPath = "/data/output2.jpg";
log.info("移动图片, 源路径{}, 目标路径{}", sourcePath, targetPath);
LinuxUtil.mvFile(jSchConfig, sourcePath, targetPath);