排查JSch连接SFTP服务器失败的问题

发布于:2025-09-10 ⋅ 阅读:(24) ⋅ 点赞:(0)

背景:

        1、SFTP服务器(A)已启动,SSH版本7.x,本机使用sftp命令测试可登录,可确定用户名/密码正确。只是输入密码后,连接时间有点长,超过10s。        

        2、客户端是使用JSch实现的,本地测试 ,连接其他服务器正常。

现象:

        客户端连接A服务器,后台日志报错,错误信息如下:

com.jcraft.jsch.JschException: Auth fail for methods 'publickey,gssapi-keyex,gssapi-with-mic,password'
        at com.jcraft.jsch.Session.connect(Session.java:520) ~[jsch-0.2.17.jar:0.2.17]


om.jcraft.jsch.JSchException:Session.connect:java.net.sokcetException: Connection  reset
        at com.jcraft.jsch.Session.connect(Session.java:569) ~[jsch-0.2.17.jar:0.2.17]

客户端源码:

        JSch jsch = new JSch();
        Session session = jsch.getSession(username, host, port);
        session.setPassword(password);
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);

        session.connect(10* 1000);

        //获取sftp通道
        return session.openChannel("sftp");

基于前面的背景情况,单独测试客户端和服务器端,都正常。两个组合在一起,就报上面的错误,属实有点摸不着头脑。不过,经过一番折腾,还是发现了端倪,具体排查过程如下:

排查过程:

        1、按照以往的经验结合日志,第一反应是服务器端缺少客户端支持的算法?又或者是服务器上的ssh配置缺少某些参数?在ssh.conf中折腾了一顿之后,发现并没有效果。

        2、查看服务器上的日志,包括message、aduit、secure等日志,看是否有可以提供的信息,答案还是无。

        3、怀疑服务器的SSH版本过低,与客户端的JSch版本不兼容?换了一台同版本的SSH服务器,结果可以正常登录。问题也不在这儿!

        4、怀疑代码里面的用户名/密码有误?那就加上打印日志,看下输出。很遗憾,用户名密码也是对的。此时,又陷入了迷茫。

        忽然间,看到了源码中的超时时间设置是10s,又想到通过sftp命令测试本机登录时,连接的时间很慢。嗯,可能找到原因了,超时时间不够?

        改大代码的超时时间,从10s改成100s试试。通了,TMD真的通了!!!

        但为啥会这么慢,10s都连不上,没办法,我这人就是好奇心重,不找到原因,绝不妥协,😄

        基于以前的经验,首先就想到是不是配置了域名解析的地址,于是,直接查看/etc/resolv.conf的配置信息。好家伙,还真配了2个地址。那就先把他们都注释掉,然后本机用sftp命令看下效果,发现本机sftp命令都连不上了,看来这个地址不能改。

        于是,挨个地址进行恢复,重新测试,可以连上。由于这个配置是生产环境,不清楚具体的组网情况,没法更深入定位原因了,行吧,就到这里。

        


网站公告

今日签到

点亮在社区的每一天
去签到