1.背景:
某机构升级了ssh版本,对应造成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
小插曲:对应我维护的项目是一个老的项目,历经几任研发,生产只有一个jar包在运行,没有文档,也无代码,一旦有问题,那可真是要命,因为是对外的项目,承接外部机构,陆续出现了一些,更换http证书、rsa秘钥的,好在可以直接解压jar去修改配置文件,现在是更换依赖版本那可真是头疼,只能试,原因是有些jar包版本升级有些包路径、方法可能会有更新;这种情况,无解,没有好的办法;好在对应反编译中import路径对应无更新,对应方法五更改,所以可以替换,下面是替换过程,请参考;
2.解决方案;
2.1 机构方对应/etc/sshd_config 加入支持的低版本jsch-0.1.50.jar支持的算法,请参考对应引用;
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 重新启动项目:
福利:对应启动脚本分享:
#!/bin/sh
## java env
## API_NAME : 包名
API_NAME=bull-prepose-file
JAR_NAME=`ls $API_NAME*.jar`
#PID 代表是PID文件
PID=$API_NAME\.pid
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.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
}
#输出运行状态
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
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
exit 0