首页 游戏 软件 资讯 排行榜 专题
首页
科技数码
Spring Boot + sshd-sftp:SSH 命令与文件传输实践

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

热心网友
60
转载
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。

相关攻略

OpenClaw停更9天后推出3.22大更新,普通用户升级前必读提醒
业界动态
OpenClaw停更9天后推出3.22大更新,普通用户升级前必读提醒

编辑 | 王凤枝沉寂9天之后,OpenClaw正式推送了号称里程碑的3 22大版本更新,但我们给普通用户的核心建议是,千万别急着点升级。3月22日,项目创始人彼得·斯坦伯格(Peter Steinb

热心网友
03.25
ClawdBot病毒预警:全球企业CEO紧急呼吁禁止安装防御指南
AI
ClawdBot病毒预警:全球企业CEO紧急呼吁禁止安装防御指南

新智元报道编辑:Aeneas【新智元导读】一夜爆红的ClawdBot,正在把无数公司和个人推向深渊:端口裸奔、无鉴权、可被远程接管。现在,暴力破解、数据清空已经真实发生了,这不是危言耸听。各位CEO

热心网友
01.28
Spring Boot + sshd-sftp:SSH 命令与文件传输实践
科技数码
Spring Boot + sshd-sftp:SSH 命令与文件传输实践

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

热心网友
12.15
一文览尽!17 款 SSH 工具助你高效远程连接 Linux 服务器
科技数码
一文览尽!17 款 SSH 工具助你高效远程连接 Linux 服务器

PortX 是一款全平台覆盖的 SSH 工具,凭借强大的跨平台能力和丰富的服务器功能脱颖而出,为用户提供纯粹且高效的终端模拟体验。 1 PortXPortX 是一款全平台覆盖的 SSH 工具,凭借

热心网友
12.15
macOS使用SSH远程登录指南:手把手教你提升操作效率
科技数码
macOS使用SSH远程登录指南:手把手教你提升操作效率

在使用过程中,我发现macOS终端的操作跟Linux非常相似,那macOS是否支持SSH远程登录呢?我们今天就来揭开它的神秘面纱。 我们前面简单介绍过macOS及其简单应用,主要包括在VMware

热心网友
12.01

最新APP

恶魔秘境
恶魔秘境
角色扮演 03-29
猫和老鼠华为
猫和老鼠华为
休闲益智 03-29
暗黑之地
暗黑之地
角色扮演 03-28
你比我猜
你比我猜
休闲益智 03-26
锦绣商铺
锦绣商铺
模拟经营 03-26

热门推荐

vivo X300 Ultra 摄影师套装开箱:重塑复古影像,专业拍摄体验
网络安全
vivo X300 Ultra 摄影师套装开箱:重塑复古影像,专业拍摄体验

三月的丽江,春风载着光影的诗意,vivo于此启幕春季新品发布会,年度影像旗舰vivo X300 Ultra将如约登场。我们有幸提前执掌这款被赋予“专业V单”称号的新机,今日便与你一同,沉浸式解锁这台

热心网友
03.30
悟空浏览器悬浮搜索用法详解,轻松启用高效搜索窗
电脑教程
悟空浏览器悬浮搜索用法详解,轻松启用高效搜索窗

悟空浏览器支持五种调出搜索悬浮窗的方式:一、地址栏长按;二、左边缘手势滑动;三、启用chrome: flags中的“Enable search bubble UI”;四、侧边栏添

热心网友
03.30
13年前就拥抱增程动力的宝马,如何看待增程式车型?
科技数码
13年前就拥抱增程动力的宝马,如何看待增程式车型?

快科技3月30日消息,日前,宝马产品负责人贝恩德·克尔伯在接受BMW Blog采访时明确表示,公司对增程车型持观望态度,虽技术上完全可行,但现实需求尚未明确,暂未做出量产决策。这一表态与宝马研发负责

热心网友
03.30
腾讯AI全景亮相中国网络媒体论坛郑州举行
科技数码
腾讯AI全景亮相中国网络媒体论坛郑州举行

大象新闻·大象财富记者 李莉 张迪驰3月29日,以“发挥主流媒体引领力 激发多元主体创造力——共创繁荣网络内容生态”为主题的2026中国网络媒体论坛在河南郑州开幕。腾讯携AI全景亮相,展示“从效率伙

热心网友
03.30
铂智第二款纯电上市,广汽丰田新能源转型稳步推进
科技数码
铂智第二款纯电上市,广汽丰田新能源转型稳步推进

3月29日,广汽丰田首款大型纯电轿车铂智7正式上市。新车推出600km和700km两种续航版本共5款配置,限时补贴权益后售价区间为14 78万元至19 98万元。作为广汽丰田继铂智3X之后的第二款纯

热心网友
03.30