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/");
}
浙公网安备 33010602011771号