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.pswp.cn/web/23793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23793.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23793.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nginx快速刪除一行

使用光標定位到要刪除的行,連續按兩次鍵盤上的字母d,則可刪除; 如果原先在編輯模式下,按esc鍵退出編輯模式,然后定位到要刪除的位,按2次d,則可快速刪除,刪除后想繼續編輯&#xff0…

延時任務工具類

自定義工具類 package com.sxfoundation.task;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.task.TaskRejectedException; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.spri…

重磅:吳恩達最新的機器學習書籍《Machine Learning Yearning》兩年磨一劍

《Machine Learning Yearning》是吳恩達歷時兩年打磨而成的機器學習和深度學習實踐寶典。這本書旨在為讀者提供實戰經驗,以幫助他們在機器學習項目中取得成功。 吳恩達通過自身多年的實踐經驗,為讀者提供了寶貴的指導,涵蓋了從項目構建到調試…

AndroidX Navigation 反復創建Fragment問題修復

目錄 解決辦法如何使用參考文檔解決辦法 自定義 FragmentNavigator,替換系統的,系統對應的 FragmentNavigator Key 為 "fragment",代碼如下,可直接拷貝使用。 import android.content.Context import android.util.Log import androidx.annotation.IdRes impor…

ts類型聲明文件、內置聲明文件

1. ts類型聲明文件 在ts中以d.ts為后綴的文件就是類型聲明文件,主要作用是為js模塊提供類型信息支持,從而獲得類型提示 1.1 第三方包用ts編寫的,會自動生成一個 .d.ts文件,進行類型聲明 1.2 有些包不是用ts編寫的,在…

【HashMap】CAS的定義及優缺點

CAS(Compare-And-Swap,比較并交換)是一種原子操作,用于實現無鎖(lock-free)的并發數據結構。它是現代處理器支持的一種硬件指令,能夠保證在多線程環境下進行變量更新時的原子性。CAS 操作包含三…

LangChain真的好用嗎?談一下LangChain封裝FAISS的一些坑

前言 最近在做一個知識庫問答項目,就是現在大模型浪潮下比較火的 RAG 應用。LangChain 可以說是 RAG 最受歡迎的工具,因此我首選 LangChain 來快速構建我的應用。坦白來講 LangChain 本身一套對于組件的定義已經讓我感覺很復雜,為什么采用 f…

Java Web學習筆記6——盒子模型

視頻標簽&#xff1a;<video> src: 規定視頻的URL controls&#xff1a;顯示播放控件 width&#xff1a;播放器的寬度 height&#xff1a;播放器的高度 音頻標簽&#xff1a;<audio> src: 規定音頻的URL controls: 顯示播放控件 段落標簽&#xff1a;<p&g…

npm yarn 更換國內源以及node歷史版本下載地址

npm 更換國內源 npm config set registryhttps://registry.npmmirror.com npm config set electron_mirrorhttps://registry.npmmirror.com/electron/yarn 更換國內源 yarn config set registry https://registry.npmmirror.comnode歷史版本下載地址 https://nodejs.org/dow…

Git版本控制:核心概念、操作與實踐

Git是一種分布式版本控制系統&#xff0c;被廣泛應用于軟件開發過程中。本文將介紹Git的核心概念、常用操作以及最佳實踐&#xff0c;幫助讀者掌握Git的基本技巧&#xff0c;提高團隊協作效率。 一、引言 在軟件開發過程中&#xff0c;版本控制是至關重要的。它能幫助我們跟蹤…

Flutter InAppWebView Unknown feature SUPPRESS_ERROR_PAGE

在使用InAppWebView的initialData加載html代碼的時候,出現java.lang.RuntimeException: Unknown feature SUPPRESS_ERROR_PAGE的出錯誤 E/MethodChannel#flutter/platform_views(16853): Failed to handle method call E/MethodChannel#flutter/platform_views(16853):<

linux驅動學習(七)之混雜設備

需要板子一起學習的可以這里購買&#xff08;含資料&#xff09;&#xff1a;點擊跳轉 一、混雜設備 混雜設備也叫雜項設備&#xff0c;是對普通的字符設備(struct cdev)的一種封裝,設計目的就是為了簡化字符設備驅動設計的流程。具有以下特點&#xff1a; 1) 主設備號為10&a…

全面解析:滲壓計數據如何預測地下水趨勢

隨著人們對水資源日益增長的需求和對環境保護意識的提升&#xff0c;地下水位的監測和預測成為了水利工程和環境科學領域的重要研究內容。滲壓計作為一種能夠測量土壤或巖石中孔隙水壓力的儀器&#xff0c;在地下水位的監測中發揮著關鍵作用。本文將從滲壓計的工作原理、安裝方…

初探富文本之基于虛擬滾動的大型文檔性能優化方案

初探富文本之基于虛擬滾動的大型文檔性能優化方案 虛擬滾動是一種優化長列表性能的技術&#xff0c;其通過按需渲染列表項來提高瀏覽器運行效率。具體來說&#xff0c;虛擬滾動只渲染用戶瀏覽器視口部分的文檔數據&#xff0c;而不是整個文檔結構&#xff0c;其核心實現根據可…

GD32F4XX的ISP方式下載程序時的串口選擇

官方資料 詳細信息可參考GD32F4xx的用戶手冊&#xff0c;第 1.4 章節 引導配置 。 版本是 &#xff1a;GD32F4xx_User_Manual_Rev3.0_CN 資料鏈接: https://www.gd32mcu.com/cn/download/6?kwGD32F4

HTML到PDF轉換,11K Star 的pdfmake.js輕松應對

在Web開發中&#xff0c;將HTML頁面轉換為PDF文件是一項常見的需求。無論是生成報告、發票、還是其他任何需要打印或以PDF格式分發的文檔&#xff0c;開發者都需要一個既簡單又可靠的解決方案。幸運的是&#xff0c;pdfmake.js庫以其輕量級、高性能和易用性&#xff0c;成為了許…

Mysql sql語句字段截取前幾位,后幾位等

MySQL 字符串截取函數詳解 在MySQL中&#xff0c;處理字符串數據時&#xff0c;我們經常需要對字符串進行截取操作。MySQL提供了多種字符串截取函數&#xff0c;用以滿足不同的需求。本文將詳細介紹這些字符串截取函數&#xff0c;包括LEFT(), RIGHT(), SUBSTRING(), SUBSTRIN…

16 - 平均售價(高頻 SQL 50 題基礎版)

16 - 平均售價 # 注意&#xff1a;between 小值 and 大值 select u.product_id, round(sum(u.units*p.price)/sum(u.units),2) average_price from Prices p left join UnitsSold u on p.product_idu.product_id -- and where u.purchase_date between p.start_date and p.e…

AB測試學習(附有相關代碼)

目錄 一、基本概念1. 定義2. 作用3. 原理 二、實驗基本原則三、實驗步驟四、實驗步驟詳解1. 確定實驗目的2. 確定實驗變量3. 實驗指標設計3.1 實驗指標類型&#xff08;按作用區分&#xff09;3.1.1 核心指標3.1.2 驅動指標&#xff08;跟蹤指標&#xff09;3.1.3 護欄指標 3.2…

使用node將頁面轉為pdf?(puppeteer實現)

本文章適合win系統下實驗&#xff08;linux&#xff0c;mac可能會出現些莫名其妙的bug我也不會解決&#xff09; 具體過程 首先了解什么時無頭瀏覽器啟動無頭瀏覽器打開指定的url頁面設置導出pdf格式開始轉化完整基礎代碼 首先了解什么時無頭瀏覽器 沒有界面的瀏覽器下載pupp…