1.背景:
某機構(gòu)升級了ssh版本骑歹,對應(yīng)造成sftp連接異常预烙,異常信息:com.jcraft.jsch.JSchException: Algorithm negotiation fail
原jsch版本:jsch-0.1.50.jar
需升級版本:jsch-0.1.53.jar
報錯說明引用:https://www.cnblogs.com/exmyth/p/14779241.html
小插曲:對應(yīng)我維護的項目是一個老的項目,歷經(jīng)幾任研發(fā)道媚,生產(chǎn)只有一個jar包在運行扁掸,沒有文檔,也無代碼最域,一旦有問題谴分,那可真是要命,因為是對外的項目镀脂,承接外部機構(gòu)牺蹄,陸續(xù)出現(xiàn)了一些,更換http證書薄翅、rsa秘鑰的钞馁,好在可以直接解壓jar去修改配置文件,現(xiàn)在是更換依賴版本那可真是頭疼匿刮,只能試僧凰,原因是有些jar包版本升級有些包路徑、方法可能會有更新熟丸;這種情況训措,無解,沒有好的辦法;好在對應(yīng)反編譯中import路徑對應(yīng)無更新绩鸣,對應(yīng)方法五更改怀大,所以可以替換,下面是替換過程呀闻,請參考化借;
2.解決方案;
2.1 機構(gòu)方對應(yīng)/etc/sshd_config 加入支持的低版本jsch-0.1.50.jar支持的算法捡多,請參考對應(yīng)引用蓖康;
2.2 客戶端解決方案:(盡量讓對方解決,問題是因為對方升級ssh造成的,對方解決不了的情況下垒手,我們在介入解決)
#先備份原jar包
cp bull-prepose-file-1.1.0.jar ../bak/
#解壓jar包
jar -xvf bull-prepose-file-1.1.0.jar
3.2 解壓后:多了三個文件夾 BOOT-INF,META-INF,org
3.3 將高版本的jsch-0.1.53.jar 放入 BOOT-INF/lib/目錄蒜焊,并刪除原版本;
3.4 重新打包科贬;
#重新打包
jar -cfM0 bull-prepose-file-1.1.0.jar ./BOOT-INF/ ./META-INF/ ./org/
3.5 重新啟動項目:
福利:對應(yīng)啟動腳本分享:
#!/bin/sh
## java env
## API_NAME : 包名
API_NAME=bull-prepose-file
JAR_NAME=`ls $API_NAME*.jar`
#PID 代表是PID文件
PID=$API_NAME\.pid
#使用說明泳梆,用來提示輸入?yún)?shù)
usage() {
echo "Usage: sh 執(zhí)行腳本.sh [start|stop|restart|status]"
exit 1
}
#檢查程序是否在運行
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#啟動方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> ${JAR_NAME} is already running PID=${pid} <<<"
else
nohup java -server -Xmx1024M -Xms1024M -Xmn1024M -XX:MaxMetaspaceSize=216M -XX:MetaspaceSize=216M -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/appuser/logs/dump/bull-prepose-file/ -Xloggc:/app/appuser/logs/dump/bull-prepose-file/gc.log -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=22232 -Dlog4j2.formatMsgNoLookups=true -jar $JAR_NAME >/dev/null 2>&1 &
echo $! > $PID
echo ">>> start $JAR_NAME successed PID=$! <<<"
fi
}
#停止方法
stop(){
#is_exist
pidf=$(cat $PID)
#echo "$pidf"
echo ">>> api PID = $pidf begin kill $pidf <<<"
kill $pidf
rm -rf $PID
sleep 2
is_exist
if [ $? -eq "0" ]; then
echo ">>> api 2 PID = $pid begin kill -9 $pid <<<"
kill -9 $pid
sleep 2
echo ">>> $JAR_NAME process stopped <<<"
else
echo ">>> ${JAR_NAME} is not running <<<"
fi
}
#輸出運行狀態(tài)
status(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> ${JAR_NAME} is running PID is ${pid} <<<"
else
echo ">>> ${JAR_NAME} is not running <<<"
fi
}
#重啟
restart(){
stop
start
}
#根據(jù)輸入?yún)?shù)榜掌,選擇執(zhí)行對應(yīng)方法优妙,不輸入則執(zhí)行使用說明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
exit 0