Java代码操作Linux系统(JSCH)

这里使用到的java库是JSCH

JSCH 是一个纯 Java 的库,用于通过 SSH 协议连接到远程服务器并执行命令、传输文件等操作。它是由 JCraft 提供的开源库,常用于实现自动化管理服务器、远程文件传输等功能。常见的应用场景包括:

  1. 执行远程命令:可以通过 SSH 连接到远程服务器并执行命令行操作。
  2. 文件传输:支持通过 SFTP 或 SCP 协议进行文件上传和下载。
  3. 端口转发:实现本地端口与远程端口之间的转发。

JSCH 使用时需要提供 SSH 登录所需的主机地址、用户名、密码或私钥等信息。

使用到的Maven依赖:

        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>

1. 封装工具类

这里根据自己的需要简单的封装了一下, 但基本是通用的,
如下:

两个方法:

  1. customCommand 通用方法, 参数为 配置项 和 指令
  2. 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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yfs1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值