当前位置: 首页 > news >正文

Java【问题 07】SSH不同版本使用jsch问题处理(7.4升级9.7及欧拉原生8.8)

SSH不同版本使用jsch问题处理

  • 1.问题一
  • 2.问题二
    • 2.1 说明
    • 2.2 解决
  • 3.问题三

1.问题一

# 1.系统
cat /etc/os-release
# 系统信息
NAME="openEuler"
VERSION="22.03 (LTS-SP1)"
ID="openEuler"
VERSION_ID="22.03"
PRETTY_NAME="openEuler 22.03 (LTS-SP1)"
ANSI_COLOR="0;31"# 2.ssh
ssh -V
# ssh信息
OpenSSH_8.8p1, OpenSSL 1.1.1m  14 Dec 2021
# 1.Java报错
com.jcraft.jsch.JSchException: Algorithm negotiation fail# 2.使用 systemctl status sshd 查看状态
Unable to negotiate with xxx.xxx.x.xxx port xxxxx: no matching host key type found. 
Their offer: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha>

问题解决:

  • 配置文件sshd_configHostKeyAlgorithms添加算法ssh-rsa
HostKeyAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-512,ssh-rsa

2.问题二

2.1 说明

OpenSSH是从原本的OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017升级到 OpenSSH_9.7p1, OpenSSL 3.2.0 23 Nov 2023,当前环境如下:

# 1.系统
CentOS Linux release 7.8.2003 (Core)# 2.ssh -V
OpenSSH_9.7p1, OpenSSL 3.2.0 23 Nov 2023
# 1.密码错误时Java报错信息
cn.hutool.extra.ssh.JschRuntimeException: JSchException: Auth fail
# 密码修改正确后 systemctl status sshd 查看状态
Accepted password for root from 123.160.246.239 port 22838 ssh2# 2.通过sftp上传文件时
cn.hutool.extra.ssh.JschRuntimeException: JSchException: channel is not opened.
# 过一会儿后 systemctl status sshd 查看状态
error: no more sessions

代码进行调试,发现报错的位置:

// 报错行
channelSftp.put(fs, directory, ChannelSftp.OVERWRITE);
// 报错信息
com.jcraft.jsch.SftpException: No such file

我一度认为是传输模式的问题,在ChannelSftp.put(InputStream src, String dst, int mode)方法中,mode参数用于指定文件传输模式,其可选值有:

  • ChannelSftp.OVERWRITE:这是默认的传输模式,它会完全覆盖目标服务器上的同名文件。如果目标文件不存在,则会创建一个新的文件。
  • ChannelSftp.RESUME:这种模式下,如果传输被中断,那么在下次调用put方法时,会从上一次中断的地方继续传输,而不是重新开始传输整个文件。
  • ChannelSftp.APPEND:此模式允许你将数据追加到目标服务器上的现有文件中,而不是覆盖它。如果目标文件不存在,则会创建一个新的文件。

换用其他模式依然报错。

2.2 解决

最终发现是代码的问题:

// 进行代码调试时发现远程登录耗时较久
SshClient.getInstance().sshRemoteCallLoginByTool(sshHost, sshPort, sshUserName, sshPassword);
// 导致创建目标目录时未执行
SshClient.getInstance().execCommandByTool("mkdir " + targetPath);

execCommandByTool方法的原始代码:

 /*** 执行命令** @param command 命令*/public String execCommandByTool(String command) {boolean isConnected = checkConnectionStatus();if (isConnected) {return JschUtil.exec(session, command, Charsets.UTF_8);}return null;}

可以看出,如果登录较慢,checkConnectionStatus的状态是false则创建目录的命令未被执行,导致上传时的文件路径不存在,出现报错信息,改进如下:

/*** 执行命令** @param command 命令*/
public String execCommandByTool(String command) {boolean isConnected = checkConnectionStatus();while (!isConnected) {isConnected = checkConnectionStatus();}return JschUtil.exec(session, command, Charsets.UTF_8);
}

3.问题三

# 连接超时异常
com.jcraft.jsch.JSchException: Session.connect: java.net.SocketTimeoutException: Read timed out
# 包损坏
com.jcraft.jsch.JSchException: Packet corrupt

异常出现的位置及处理方案:

private boolean createSessionAndConnected() {if (session == null) {log.info("SSHClient createSessionAndConnected...");session = JschUtil.createSession(this.sshHost, this.sshPort, this.sshUser, this.sshPass);Properties config = new Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);try {session.connect(8000);// com.jcraft.jsch.JSchException: Session.connect: java.net.SocketTimeoutException: Read timed out// 增加超时时间 session.connect(200000);} catch (JSchException e) {// com.jcraft.jsch.JSchException: Packet corrupt// 使用同一个session对象再次进行连接时会报错// 重新连接时使用新的session对象session = null;e.printStackTrace();log.info("SSHClient createSessionAndConnected printStackTrace");return false;}log.info("SSHClient createSessionAndConnected Success!");}return this.session.isConnected();
}
http://www.dtcms.com/a/322157.html

相关文章:

  • WD5202 非隔离降压转换芯片,220V降5V,输出电流80MA
  • Java学习Collection单列集合中的三种通用遍历方法
  • 【Erdas实验教程】029:遥感图像光谱增强(缨帽变换)
  • 经济学从业者职业发展认证体系分析
  • 在 Git 中,将本地分支的修改提交到主分支
  • 数据结构--哈希表与排序、选择算法
  • PVE 9.0 保姆级安装及优化教程(换源、网络配置、远程唤醒等)【基础篇】
  • 农行鉴权问题
  • 嵌入式 Linux 驱动开发常见问题排查宝典(驱动开发篇)v1.0
  • “人工”智能究竟需要多少人工?
  • 《设计模式之禅》笔记摘录 - 14.组合模式
  • 使用Python+selenium实现第一个自动化测试脚本
  • 【GPT-OSS 全面测评】释放推理、部署和自主掌控的 AI 新纪元
  • 1688 图片搜图找货接口开发实战:从图像特征提取到商品匹配全流程
  • InfluxDB漏洞:Metrics 未授权访问漏洞
  • 自定义上传本地文件夹到七牛云
  • 【深度学习新浪潮】GPT-5正式发布:开启博士级智能新纪元
  • Redis基础数据类型
  • 支持向量机(SVM)全解析:原理、类别与实践
  • Nestjs框架: 基于 Argon2 的用户登录注册安全机制设计与实现
  • Vue框架总结案例
  • 抖音AI分身:帮助每个抖音创作者,打造自己的AI分身
  • 垃圾堆放识别准确率↑32%:陌讯多模态融合算法实战解析
  • 设计一个 Java 本地缓存组件
  • P1119 灾后重建【题解】
  • 【动态规划 | 二维费用背包问题】二维费用背包问题详解:状态设计与转移方程优化
  • 温室韭菜收割机的设计cad【12张】三维图+设计说明书
  • WinForm 实战 (进度条):用 ProgressBar+Timer 打造动态进度展示功能
  • AUTOSAR进阶图解==>AUTOSAR_EXP_AIOccupantAndPedestrianSafety
  • C++ Primer