使用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(); } } }
企业数字化 ERP 产品动态
相关推荐
自动售货机不出货别急着砸!这几种自救方法超实用~YH 你是不是也经历过——扫码付款了,机器也响了一声,但商品卡在半空中就是不掉下来。那一刻真的恨不得给机器来一脚。别急,遇到这种情况,试试下面这几招,大概率能帮你解决问题。第一步:先确认是不是真扣款了很… · 2026/9/11 4:30:28
SIRPB1 通过 SYK 调控胶质瘤免疫微环境:基于生信与 Luminex 技术的机制解析 一、文章基本信息题为《SIRPB1 regulates inflammatory factor expression in the glioma microenvironment via SYK: functional and bioinformatics insights》,发表于转化医学领域期刊《Journal of Translational Medicine》。研究由吉林大学第一医院神经外科团队… · 2026/9/14 5:53:27
避坑指南:搞定wordpressimg相对路径的3个关键注意事项 避坑指南:搞定wordpressimg相对路径的3个关键注意事项 找建站公司最怕什么?怕花大价钱,最后网站图片加载不出来,或者SEO全废。很多新手一上来就纠结要不要找外包,其实很多时候,坑不是外包挖的,是你自己没搞懂底层逻辑,被忽悠着做了冗… · 2026/9/28 0:46:09
网站建设的目标是啥?2026最新实战拆解:别再用丑模板了 网站建设的目标是啥?2026最新实战拆解:别再用丑模板了 别再盯着那些套模板做出来的“垃圾站”发愁了。 很多创业老板问我,为什么花了大几万做的官网,客户看一眼就划走? 答案很简单:… · 2026/9/28 0:46:09
十大招标网站排行榜多少钱?被黑挂马后怎么救 十大招标网站排行榜多少钱?被黑挂马后怎么救 你的网站昨晚刚上线,今天登录后台发现首页全乱,代码里多了几段莫名其妙的 JS,浏览器直接弹出“您的计算机不安全”警告。这时候你心里只有一个念头: 网站被黑挂马不知道怎么办 ,找谁修, 多少钱… · 2026/9/28 0:45:50
宿州网站网站建设怎么选?改需求拖一周,这3招救急 宿州网站网站建设怎么选?改需求拖一周,这3招救急 在宿州做网站,最让人崩溃的不是代码写不出来,而是改个按钮颜色,建站公司能拖你整整一周。这种体验,直接决定了你的客户是流失还是下单。… · 2026/9/28 0:45:26
从零搭建WordPress调用图标避坑指南,省下万元外包费 从零搭建WordPress调用图标避坑指南,省下万元外包费 找建站公司做官网,最怕什么?不是技术不行,而是报价离谱。很多老板发现,明明是个简单的WordPress后台,对方张口就是大几万,理由五花八门:定制开发、品牌溢价、后期维护。其实,只… · 2026/9/28 0:45:14
网站如何交换链接新手入门避坑指南 网站如何交换链接新手入门避坑指南 找建站公司最怕被坑高价,这几乎是所有新手入门的第一课。别急着掏钱,先搞懂 网站如何交换链接… · 2026/9/28 0:44:56
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
制作网页比较方便的软件怎么选?一文搞懂避坑指南 制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25