当前位置: 首页
科技数码
Spring Boot + sshd-sftp:SSH 命令与文件传输实践

Spring Boot + sshd-sftp:SSH 命令与文件传输实践

热心网友 时间:2025-12-15
转载

在现代分布式系统中,服务器间的远程操作与文件传输是常见需求。SSH作为一种安全的网络协议,为远程登录和文件传输提供了可靠保障。

前言

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

在现代分布式系统中,服务器间的远程操作与文件传输是常见需求。SSH作为一种安全的网络协议,为远程登录和文件传输提供了可靠保障。

环境准备

sshd-sftp是Apache MINA项目旗下的SSH服务器组件,支持SSHv2协议,提供了丰富的API用于构建SSH客户端和服务器。相比传统的JSch库,sshd-sftp具有更活跃的社区维护和更完善的功能支持,尤其在处理大文件传输和并发连接时表现更优。

案例

效果图

图片图片

核心依赖

org.apache.sshd sshd-sftp 2.10.0

SSH 连接管理

建立和管理SSH连接是所有操作的基础,合理的连接池设计能有效提升系统性能。

创建SshClientUtil工具类管理连接生命周期:

import lombok.extern.slf4j.Slf4j;import org.apache.sshd.client.SshClient;import org.apache.sshd.client.session.ClientSession;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import java.io.IOException;@Slf4j@Componentpublic class SshClientUtil { @Value("${ssh.host:182.168.1.101}") private String host; @Value("${ssh.port:22}") private int port; @Value("${ssh.username:root}") private String username; @Value("${ssh.password:root}") private String password; @Value("${ssh.timeout:5000}") private int timeout; private SshClient client; private ClientSession session; /** * 建立SSH连接 */ public void connect() throws IOException { if (session != null && session.isOpen()) { return; } client = SshClient.setUpDefaultClient(); client.start(); session = client.connect(username, host, port) .verify(timeout) .getSession(); session.addPasswordIdentity(password); session.auth().verify(timeout); log.info("SSH连接成功"); } /** * 断开SSH连接 */ public void disconnect() throws IOException { if (session != null && session.isOpen()) { session.close(); } if (client != null && client.isStarted()) { client.stop(); } } public ClientSession getSession() throws IOException { if (session == null || session.isEmpty() ||session.isClosed()) { connect(); } return session; }}

远程命令执行

通过SSH协议执行远程命令是服务器管理的常用功能,需要处理命令输出和错误信息。

import org.apache.sshd.client.channel.ChannelExec;import org.apache.sshd.client.channel.ClientChannelEvent;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import java.io.*;import java.util.ArrayList;import java.util.Arrays;import java.util.List;@Servicepublic class RemoteCommandService { @Autowired private SshClientUtil sshClientUtil; @Value("${ssh.charset:UTF-8}") private String charset; /** * 执行单条SSH命令 * * @param command 命令字符串 * @return 命令输出结果 */ public String executeCommand(String command) throws IOException { try (ChannelExec channel = sshClientUtil.getSession().createExecChannel(command)) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ByteArrayOutputStream errorStream = new ByteArrayOutputStream(); channel.setOut(outputStream); channel.setErr(errorStream); channel.open(); channel.waitFor(Arrays.asList(ClientChannelEvent.CLOSED), 0); int exitStatus = channel.getExitStatus(); if (exitStatus != 0) { String errorMsg = new String(errorStream.toByteArray(), charset); throw new RuntimeException("命令执行失败: " + errorMsg); } return new String(outputStream.toByteArray(), charset); } } /** * 执行多条命令(按顺序执行) * * @param commands 命令列表 * @return 命令输出结果列表 */ public List executeCommands(List commands) throws IOException { List results = new ArrayList<>(); for (String cmd : commands) { results.add(executeCommand(cmd)); } return results; }}

文件上传与下载

SFTP是基于SSH的安全文件传输协议,相比FTP具有更高的安全性。

import org.apache.sshd.sftp.client.SftpClient;import org.apache.sshd.sftp.client.SftpClientFactory;import org.apache.sshd.sftp.common.SftpException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import java.io.*;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.util.ArrayList;import java.util.Arrays;import java.util.List;@Servicepublic class SftpFileService { @Autowired private SshClientUtil sshClientUtil; @Value("${ssh.charset:UTF-8}") private String charset; /** * 上传本地文件到远程服务器 * * @param localFilePath 本地文件路径 * @param remoteDir 远程目录路径 */ public void uploadFile(String localFilePath, String remoteDir) throws IOException { try (SftpClient client = SftpClientFactory.instance().createSftpClient(sshClientUtil.getSession()); SftpClient.CloseableHandle handle = client.open(remoteDir, SftpClient.OpenMode.Write, SftpClient.OpenMode.Create)) { // 上传文件 Path local = Paths.get(localFilePath); client.write(handle, 0, Files.readAllBytes(local)); } } /** * 从远程服务器下载文件 * * @param remoteFilePath 远程文件路径 * @param localDir 本地目录路径 */ public void downloadFile(String remoteFilePath, String localDir) throws IOException { try (SftpClient client = SftpClientFactory.instance().createSftpClient(sshClientUtil.getSession()); SftpClient.CloseableHandle handle = client.open(remoteFilePath, SftpClient.OpenMode.Read); OutputStream out = Files.newOutputStream(Paths.get(localDir))) { long size = client.stat(handle).getSize(); byte[] buffer = new byte[8192]; for (long offset = 0; offset < size; ) { int len = client.read(handle, offset, buffer, 0, buffer.length); out.write(buffer, 0, len); offset += len; } } } /** * 递归创建远程目录 */ private void mkdirs(SftpClient client, String dir) throws IOException { String[] dirs = dir.split("/"); String currentDir = ""; for (String d : dirs) { if (d.isEmpty()) continue; currentDir += "/" + d; try { client.stat(currentDir); // 检查目录是否存在 } catch (IOException e) { client.mkdir(currentDir); // 不存在则创建 } } }}

来源:https://www.51cto.com/article/824502.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
荣耀MagicOS四月升级:自定义锁屏小组件与指纹样式,新增 Mac 跨设备文件管理功能

荣耀MagicOS四月升级:自定义锁屏小组件与指纹样式,新增 Mac 跨设备文件管理功能

荣耀MagicOS四月体验升级:流畅革新,从系统细节到全场景生态的全面进化 日前,荣耀产品经理通过官方渠道正式发布了四月份MagicOS体验升级的详细内容。此次更新并非简单的功能修补,而是从个性化、智慧交互、跨设备协同到生态服务进行全方位优化,为用户带来由内而外的流畅新体验。 核心升级亮点全解析 那

时间:2026-04-01 22:42
外卖员给AI打工?从送餐到「喂」数据,800万骑手成AI训练师

外卖员给AI打工?从送餐到「喂」数据,800万骑手成AI训练师

外卖员成为AI训练数据采集的关键力量?幕后真相揭秘 近期一则行业动态,引发了广泛关注。美国外卖巨头DoorDash悄然上线了一款名为“Tasks”的应用程序。简而言之,该平台的外卖员在完成送餐后,可通过额外拍摄街景视频、记录送餐过程或上传店铺照片等任务,获取附加报酬。DoorDash官方解释称,此举

时间:2026-04-01 22:33
杜比第四度入选《Fast Company》“全球最具创新力公司”年度榜单

杜比第四度入选《Fast Company》“全球最具创新力公司”年度榜单

杜比实验室荣获《Fast Company》“2026全球最具创新力公司”认可 在全球消费电子市场,定义未来的往往是那些敢于引领趋势的革新者。今日,杜比实验室郑重宣布,其凭借突破性的技术创新,成功入选《Fast Company》杂志2026年度“全球最具创新力公司”权威榜单。该榜单素来以甄选各行业中通

时间:2026-04-01 22:33
全渠道第一,高端称王!追觅扫地机AWE实力霸榜

全渠道第一,高端称王!追觅扫地机AWE实力霸榜

作为全球高端扫地机器人市场领导者,追觅扫地机凭借卓越产品力与创新技术,在AWE2026期间斩获全渠道销量与销售额双冠,市场占有率突破49%,领军地位显著。 近日,上海举办的中国家电及消费电子博览会(AWE 2026)圆满落幕,这场盛会被视为年度智能家居行业发展的风向标。在全球知名品牌同台竞技的舞台上

时间:2026-04-01 22:26
嵌入式厨电的新变量:小米搅局后,微蒸烤一体机走向“高低分化”

嵌入式厨电的新变量:小米搅局后,微蒸烤一体机走向“高低分化”

米家智能微蒸烤一体机 Pro 嵌入式 52L 全新上市:AI智能烹饪结合 TFT 大彩屏,售价4699元 最近,小米有品平台正式推出了新款厨电——米家智能微蒸烤一体机 Pro 嵌入式 52L,定价4699元。这款产品主打 AI 精准算法,能够智能控制烹饪过程,有效降低操作失误率,同时配备高清TFT大

时间:2026-04-01 22:19
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程