解决JSch连接SFTP的三大常见错误
使用sftp服务时用到jsch类去实现远程连接ssh服务这次在实现的过程中遇到了这样几类错误记录一下供参考问题1Algorithm negotiation fail原因由于我现在用的jsch版本和服务器版本不兼容导致客户端算法无法匹配服务器如何确认在用jsch连接之前设定输出日志查看客户端和服务器支持的解密算法区别如何修正升级版本到2.28.2并在pom.xml中显示的指定版本问题2verify:false原因和第一个问题一样版本不兼容但是我解决完版本问题之后发现还是报这个错误历史版本是jsch0.1.54版本后来升级到0.1.55仍然报错最终升级到2.28.2依然报错后来在pom.xml里显式的排除了老版本的jsch才彻底解决这个问题主要原因是版本冲突了如何确认在生成的jar中查看 jar 包内 META-INF/MANIFEST.MF解压jsch-0.1.55.jar打开META-INF/MANIFEST.MF里面会有Implementation-Version: 0.1.55这个是 maven 打包真实版本虽然我声明了2.28.2版本但是打包的内容仍然是0.1.55.如何修正1.显式声明版本在项目pom.xml中直接依赖jsch:2.28.2利用最短路径优先规则覆盖如果项目含有多个模块相互依赖则每个都加上依赖2.使用exclusions排除冲突版本dependencydependency groupIdcom.github.mwiede/groupId artifactIdjsch/artifactId version2.28.2/version exclusions exclusion groupIdcom.jcraft/groupId artifactIdjsch/artifactId /exclusion /exclusions /dependency问题3SSH_FX_NO_SUCH_FILE出现这个错误已经表示连接没有问题看字面意思就是服务器不存在要上传的目标路径因为sftp不会自动建立目录所以需要手动递归建立各级目录最终使用jsch正确连接并上传文档的代码如下import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpException; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Properties; public class SftpUtil { private final String host; private final int port; private final String username; private final String password; private Session session; private ChannelSftp channelSftp; public SftpUtil(String host, int port, String username, String password) { this.host host; this.port port; this.username username; this.password password; } /** * 对外方法1建立SFTP连接 * 用setPassword */ SuppressWarnings(deprecation) public void sftpConnect() throws JSchException { if (session ! null session.isConnected()) { return; } JSch jsch new JSch(); session jsch.getSession(username, host, port); // 直接使用废弃方法加注解消除警告 session.setPassword(password); Properties config new Properties(); // 依靠该配置绕过主机指纹校验替代setHostKeyVerifier config.put(StrictHostKeyChecking, no); session.setConfig(config); // 连接超时30秒 session.connect(30000); // 打开SFTP通道 ChannelSftp channel (ChannelSftp) session.openChannel(sftp); channel.connect(); this.channelSftp channel; } /** * 对外方法2上传文件自动创建远程多级目录 * param localFilePath 本地文件绝对路径 * param remoteFullPath 远程完整路径 /xxx/yyy/file.txt */ public void sftpUpload(String localFilePath, String remoteFullPath) throws Exception { // 先确保连接已初始化 sftpConnect(); File localFile new File(localFilePath); if (!localFile.exists() || !localFile.isFile()) { throw new Exception(本地文件不存在 localFilePath); } // 截取远程父目录 int lastSlashIndex remoteFullPath.lastIndexOf(/); String remoteParentDir remoteFullPath.substring(0, lastSlashIndex); // 递归创建目录解决 SSH_FX_NO_SUCH_FILE mkdirRecursive(remoteParentDir); // 上传文件 try (InputStream inputStream new FileInputStream(localFile)) { channelSftp.put(inputStream, remoteFullPath); } } /** * 内部递归创建远程多级目录等价 mkdir -p */ private void mkdirRecursive(String remoteDir) throws SftpException { if (remoteDir null || remoteDir.isBlank()) { return; } String[] dirArr remoteDir.replaceFirst(^/, ).split(/); String currentPath /; for (String dir : dirArr) { if (dir.isBlank()) { continue; } currentPath dir /; try { channelSftp.cd(currentPath); } catch (SftpException e) { if (e.id ChannelSftp.SSH_FX_NO_SUCH_FILE) { channelSftp.mkdir(currentPath); channelSftp.cd(currentPath); } else { throw e; } } } } /** * 关闭连接释放资源 */ public void close() { if (channelSftp ! null channelSftp.isConnected()) { channelSftp.disconnect(); } if (session ! null session.isConnected()) { session.disconnect(); } } // 测试入口 public static void main(String[] args) { SftpUtil sftp new SftpUtil(你的ip, 端口, 你的用户名, 你的密码); try { sftp.sftpConnect(); System.out.println(SFTP连接成功); sftp.sftpUpload(D:/test.txt, /data/upload/202606/test.txt); System.out.println(文件上传完成); } catch (Exception e) { e.printStackTrace(); } finally { sftp.close(); } } }

相关新闻

一次请求的 DI 到底怎么跑:从 HttpContext.RequestServices 创建 Scope 到 ServiceProvider.GetService 的第一跳

一次请求的 DI 到底怎么跑:从 HttpContext.RequestServices 创建 Scope 到 ServiceProvider.GetService 的第一跳

本文想做的事情很具体:把“每请求 scope”的创建和释放,落到两处能在源码里指认、在调试器里复现的点上——RequestServicesFeature 的 getter,以及 Response.RegisterForDisposeAsync。 很多 ASP.NET Core 开发者都听过 scoped 服务“每请求…

2026/6/27 5:54:32阅读更多 →
标记“”不是此版本中的有效语句分隔符

标记“”不是此版本中的有效语句分隔符

问题原因 PowerShell 版本过低‌:Windows 自带的 PowerShell 不支持&&运算符,该运算符从 PowerShell 7.0 才开始支持。 使用 $PSVersionTable 变量 $PSVersionTable 是一个包含PowerShell版本和其他系统信息的哈希表。你可以直接查看这个变量来…

2026/6/27 5:49:31阅读更多 →
必得8元 免费领取 教程!最新可用!

必得8元 免费领取 教程!最新可用!

如果你想薅一下羊毛,想喝一下免费的奶茶,真的可以试一下这个口令:千问新用户专属860982就能领8元支付宝无门槛立减券,外卖、打车、网购都能用。这个福利有效期是领到之后14天,每个手机号和设备只能领一次~

2026/6/27 5:49:31阅读更多 →
DOPE-PEG-CY3 荧光磷脂不同 PEG 分子量荧光亮度与抗团聚性能差异说明

DOPE-PEG-CY3 荧光磷脂不同 PEG 分子量荧光亮度与抗团聚性能差异说明

一、材料基础结构DOPE-PEG-CY3 为不饱和油酰磷脂荧光标记脂质,三段结构:DOPE 疏水脂质段:带有不饱和脂肪酸双烷基链,兼具优良膜嵌入能力,可高效融合细胞膜磷脂双层结构。PEG 亲水间隔链:包裹于纳米载体表层…

2026/6/27 7:09:39阅读更多 →
从Chatbot到数字员工:2026年AI Agent落地的5个真相

从Chatbot到数字员工:2026年AI Agent落地的5个真相

79%的企业已经部署了AI Agent,但40%的项目面临被叫停。在这场从"会说话"到"会干活"的跃迁中,到底什么在推动变革,什么又在拖后腿?一、一个数字背后的转折点 2026年第二季度,一组数据让整个行业重新…

2026/6/27 7:09:39阅读更多 →
[SWPUCTF 2021新生赛]nc签到

[SWPUCTF 2021新生赛]nc签到

1. 工具:Windows 版 netcat(nc-win32)工具存放路径:D:\cxdownload\netcat-win32-1.11\netcat-1.11\ 作用:建立 TCP 网络连接,获取靶机提供的交互式 Linux 虚拟终端。2. 前置知识铺垫nc ip 端口:…

2026/6/27 7:09:39阅读更多 →
Photoshop Mac 使用教程Photoshop Mac 2026下载安装教程

Photoshop Mac 使用教程Photoshop Mac 2026下载安装教程

文章目录Photoshop Mac 2026 安装包获取Photoshop Mac 2026 安装教程(全流程详解)Photoshop Mac版必学的10个基础操作,新手入门不再难Adobe Photoshop(简称PS)是Adobe公司出品的专业图像处理工具,覆盖平面设…

2026/6/27 7:09:39阅读更多 →
从代码到赛场:亚马逊云科技用黑客松打开了体育科技的想象空间

从代码到赛场:亚马逊云科技用黑客松打开了体育科技的想象空间

6月23日至24日,上海世博中心,一场特殊的“选秀”正在上演。60名开发者齐聚亚马逊云科技中国峰会现场,用代码和算法,在24小时内预测2026年NBA选秀第一轮的最终结果。6 月 24 日中午,随着 2026 年 NBA 选秀大会首轮结果全…

2026/6/27 7:09:39阅读更多 →
硅基流动公有云 MaaS 助力科研实验室一站式实现模型弹性调用与精细化治理

硅基流动公有云 MaaS 助力科研实验室一站式实现模型弹性调用与精细化治理

当一个科研团队的工作台上同时摊开 DeepSeek、Kimi、Qwen、GLM 等多个开源大模型,真正的难题往往不是“选哪一个模型”,而是一些更现实的问题:今天要跑几百万条数据,明天可能只跑几万条;这个课题组要追最新权重&#x…

2026/6/27 7:04:39阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/27 5:46:02阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →