winserver备份到miniio

  1. winserver 安装openssh

  2. 备份代码
    package org.hf.ywyt_minio.openssh;

import com.jcraft.jsch.*;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.hf.ywyt_minio.denum.DateFmt;
import org.hf.ywyt_minio.util.DateFmtUtil;

import java.io.InputStream;
import java.util.Properties;

//远程上传目录demo
public class SshDirToMinio {

/* --- MinIO --- */
private static final String MINIO_URL   = "http://192.168.10.12:9000";
private static final String MINIO_AK    = "H";
private static final String MINIO_SK    = "7g";
private static final String BUCKET      = "rpt";
private static final String OBJECT_KEY  = "rpt"+ DateFmtUtil.getDateFmt(DateFmt.FULL_minio) +".zip";


private static final String SSH_HOST   = "192.168.10.2";  // WinServer IP
private static final int    SSH_PORT   = 22;
private static final String SSH_USER   = "administrator";
private static final String SSH_PASS   = "Hxxx";
private static final String REMOTE_DIR = "D:\\tomcat-win64\\webapps\\webroot";   // 要压缩的目录

private static final String REMOTE_ZIP = "D:\\temp\\"+ OBJECT_KEY; // 远程 zip 路径
private static final String REMOTE_ZIP_UPLOAD = '/'+REMOTE_ZIP.replace('\\', '/');

private static final MinioClient minio = MinioClient.builder()
        .endpoint(MINIO_URL)
        .credentials(MINIO_AK, MINIO_SK)
        .build();

private static Session session;
static {
    try {
    JSch jsch = new JSch();
    session = jsch.getSession(SSH_USER, SSH_HOST, SSH_PORT);
    session.setPassword(SSH_PASS);
    Properties cfg = new Properties();
    cfg.put("StrictHostKeyChecking", "no");
    session.setConfig(cfg);
    session.connect(10_000);
    } catch (JSchException e) {
        session.disconnect();
        throw new RuntimeException(e);
    }
}

public static void main(String[] args)  {

    try {
        // 1. 桶存在检查
        if (!minio.bucketExists(BucketExistsArgs.builder().bucket(BUCKET).build())) {
            minio.makeBucket(MakeBucketArgs.builder().bucket(BUCKET).build());
        }

        // 2. 远程压缩
        zipOnWindows();

        // 3. 直接从远程流上传到 MinIO
        uploadRemoteZipToMinIO();

        // 4. 可选:删除远程 zip
        deleteRemoteZip();

        System.out.println("✅ 远程压缩 → 流式上传 MinIO 完成!");
    } catch (Exception e){
        throw new RuntimeException(e);
    } finally {
        if(minio != null) {

            try {
                minio.close();
            } catch (Exception e2) {
                throw new RuntimeException(e2);
            }

        }
    }
}

/* 1. 远程压缩 */
private static void zipOnWindows() {
    ChannelExec exec=null;

    try {

// String cmd = String.format(
// "powershell -command "if (Test-Path '%s') { Remove-Item '%s' -Force }; " +
// "Compress-Archive -Path '%s\*' -DestinationPath '%s'"",
// REMOTE_ZIP, REMOTE_ZIP, REMOTE_DIR, REMOTE_ZIP);

        String cmd = String.format(
                "powershell -command \"Compress-Archive -Path '%s' -DestinationPath '%s'\"",
                REMOTE_DIR, REMOTE_ZIP);

        //System.out.println(">>> 远程命令:\n" + cmd);

        exec = (ChannelExec) session.openChannel("exec");
        exec.setCommand(cmd);
        exec.setErrStream(System.err);
        exec.connect();

        while (!exec.isClosed()) Thread.sleep(500);
        int exit = exec.getExitStatus();

        if (exit != 0) throw new RuntimeException("远程压缩失败,exit=" + exit);
        System.out.println("✅ 远程压缩完成 -> " + REMOTE_ZIP);

    }catch (JSchException | InterruptedException je){

        if(session != null) {
            session.disconnect();
        }

        throw new RuntimeException("远程压缩失败"+je.getMessage());
    } finally {
        if (exec != null) {
            exec.disconnect();
        }

    }

}

/* 2. 从远程流直接上传 MinIO */
private static void uploadRemoteZipToMinIO() {
    ChannelSftp sftp=null;

    try{
    sftp = (ChannelSftp) session.openChannel("sftp");
    sftp.connect();

    // 获取远程文件大小
    long size = sftp.lstat(REMOTE_ZIP_UPLOAD).getSize();

    // 获取远程输入流
    try ( InputStream in = sftp.get(REMOTE_ZIP_UPLOAD) ) {
        minio.putObject(
                PutObjectArgs.builder()
                        .bucket(BUCKET)
                        .object(OBJECT_KEY) // 对象名
                        .stream(in, size, -1) // 大小已知,分片自动64m
                        .contentType("application/zip")
                        .build());
    }

    System.out.println("✅ 已流式上传到 MinIO: " + BUCKET );

    }catch (Exception je){

        if(session != null) {
            session.disconnect();
        }

        throw new RuntimeException("上传失败"+je.getMessage());
    } finally {
        if (sftp != null) {
            sftp.disconnect();
        }

    }

}

/* 3. 删除远程 zip */
private static void deleteRemoteZip() throws Exception {
    ChannelExec exec =null;

    try{
    exec = (ChannelExec) session.openChannel("exec");
    exec.setCommand("powershell -command \"Remove-Item '" + REMOTE_ZIP + "' -Force\"");
    exec.connect();
    while (!exec.isClosed()) Thread.sleep(200);

    System.out.println("✅ 已清理远程 zip");
    }catch (Exception je){

        throw new RuntimeException("删除"+je.getMessage());
    } finally {
        if (exec != null) {
            exec.disconnect();
        }

        if(session != null) {
            session.disconnect();
        }

    }

}

}

posted @ 2025-10-18 00:29  自在现实  阅读(12)  评论(0)    收藏  举报