偶尔晴天

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. 在 pom.xml 引入以下依赖

<dependency>
    <groupId>ch.ethz.ganymed</groupId>
    <artifactId>ganymed-ssh2</artifactId>
    <version>build210</version>
</dependency>

2. 相关代码

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;

/**
 * 从远程服务器上用scp命令下载文件
 */
public class SCPClientUtil {
    private static final Logger logger = LoggerFactory.getLogger(SCPClientUtil.class);

    private static SCPClientUtil instance;

    // 多线程调用加锁
    public static synchronized SCPClientUtil getInstance(String ip, int port, String username, String password) {
        if (instance == null) {
            instance = new SCPClientUtil(ip, port, username, password);
        }
        return instance;
    }

    /**
     * 构造函数,赋值的过程
     * @param ip    ip
     * @param port  端口号
     * @param username  用户名
     * @param password  密码
     */
    public SCPClientUtil(String ip, int port, String username, String password) {
        this.ip = ip;
        this.port = port;
        this.username = username;
        this.password = password;
    }

    /**
     * 从服务器下载文件
     * @param remoteFile        远程服务器文件所在位置(路径+文件名)
     * @param localDirectory    下载文件保存到本地的路径
     */
    public void getFile(String remoteFile, String localDirectory) {
        Connection conn = new Connection(ip, port);

        try {
            conn.connect();
            boolean authenticate = conn.authenticateWithPassword(username, password);
            if(authenticate) {
                SCPClient client = new SCPClient(conn);

                Session session = conn.openSession();   // 连接之后,可以执行任意xshell命令

                if(!"root".equals(username)) {
                    session.execCommand("chmod u+rwx "+ remoteFile); // 增加文件可操作权限,一般root用户不用增加
                }

                File file = new File(localDirectory);
                if(!file.exists()) {    // 判断此路径在本地是否存在
                    file.mkdirs();  // 创建路径
                }

                client.get(remoteFile, localDirectory);     // 下载文件

                session.execCommand("rm -rf "+ remoteFile); // 下载完成后,删除服务器上源文件

                session.close();
                conn.close();
            }else {
                logger.info("创建连接失败");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 把本地文件上传到服务器
     * @param localFile         本地文件所在位置(路径+文件名)
     * @param remoteDirectory   上传文件保存的服务器位置路径
     */
    public void putFile(String localFile, String remoteDirectory) {
        Connection conn = new Connection(ip, port);

        try {
            conn.connect();
            boolean authenticate = conn.authenticateWithPassword(username, password);
            if(authenticate) {
                SCPClient client = new SCPClient(conn);
                client.put(localFile, remoteDirectory); // 上传文件

                conn.close();
            }else {
                logger.info("创建连接失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String ip;  // 服务器ip地址

    private Integer port;   // 开放端口号

    private String username;    // ssh用户名

    private String password;    // ssh密码

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public Integer getPort() {
        return port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

3. 调用方式

@GetMapping("/get")
public void get() {
    SCPClientUtil instance = SCPClientUtil.getInstance("192.168.31.11", 22, "root", "admin12.");

    // 从服务器下载文件
    instance.getFile("/000/test/test.txt", "/Users/Desktop/");
}

@GetMapping("/put")
public void put() {
    SCPClientUtil instance = SCPClientUtil.getInstance("192.168.31.11", 22, "root", "admin12.");

    // 上传文件到服务器
    instance.putFile("/Users/Desktop/test.txt", "/000/test/");
}
posted on 2020-11-17 17:43  偶尔晴天  阅读(510)  评论(0)    收藏  举报