SFTP连接异常 Could not connect to SFTP server. Caused by: com.jcraft.jsch.JSchException: Auth fail

解决SFTP Authfail异常
连接SFTP服务器时总是抛出以下异常,而且自己也在本地测试800多遍了都没有任何问题,就是在Linux平台下出现的
org.apache.commons.vfs.FileSystemException: Could not connect to SFTP server at "168.22.73.69".
    at org.apache.commons.vfs.provider.sftp.SftpClientFactory.createConnection(SftpClientFactory.java:214)
    at com.wxcking.admins.util.sftp.SFTPUtil.connectServer(SFTPUtil.java:270)
    at com.wxcking.admins.util.sftp.SFTPUtil.<init>(SFTPUtil.java:66)
    at com.wxcking.admins.util.SftpConnectUtil.connectSupBankSftp(SftpConnectUtil.java:36)
    at com.wxcking.admins.redeem.service.RedemptionBankService.uploadRegulatoryBank(RedemptionBankService.java:285)
    at com.wxcking.admins.redeem.service.RedemptionBankService$$FastClassByCGLIB$$864fe42a.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:627)
    at com.wxcking.admins.redeem.service.RedemptionBankService$$EnhancerByCGLIB$$b98834a5.uploadRegulatoryBank(<generated>)
    at com.wxcking.manage.contract.service.adminsRedeemCollectService.processCollect(adminsRedeemCollectService.java:89)
    ... ...
Caused by: com.jcraft.jsch.JSchException: Auth fail
    at com.jcraft.jsch.Session.connect(Session.java:464)
    at com.jcraft.jsch.Session.connect(Session.java:158)
    at org.apache.commons.vfs.provider.sftp.SftpClientFactory.createConnection(SftpClientFactory.java:210)
    ... 111 more
这种异常主要是看Caused by后面的 com.jcraft.jsch.JSchException: Auth fail,报的是 Caused by: com.jcraft.jsch.JSchException: Auth fail验证失败。另外,使用FlashFXP等工具连接SFTP时都没有问题,使用Java写的程序连接出现Auth fail异常。
从网上查询到解决的方法:
第一种说法是配置参数比如用户名和密码等配置错误。
第二说法是在/etc/ssh/sshd_config文件夹的一个配置项PasswordAuthentication 默认为no,“PasswordAuthentication”设置是否允许口令验证,把它改为yes,重启服务就OK了。
如果您在这一步就已经解决好Auth fail异常的话,祝贺您,您太幸运了!
-----------------------------------------
-----------------------------------------
-----------------------------------------
当我把以上方法都试了以后,还是报Auth fail异常,这时要看一下SFTP连接代码了,在连接SFTP代码中加上下面代码,另外再实现一个日志类。
/**
 * SFTP工具类
 */
public class SFTPUtil {
    /**
     * 连接SFTP服务器
     * @throws JSchException
     * @throws FileSystemException
     */
    private void connectServer() throws JSchException, FileSystemException {
        if (this.channel != null) {
            disconnect();
        }
        
        com.jcraft.jsch.Logger logger = new SettleLogger();
        JSch.setLogger(logger);

        
        FileSystemOptions fso = new FileSystemOptions();
        SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(fso, "no");
        
        this.session = SftpClientFactory.createConnection(this.ftpHost,
                this.ftpPort, this.userName.toCharArray(),
                this.password.toCharArray(), fso);
        Channel _channel = this.session.openChannel("sftp");
        _channel.connect();
        this.channel = ((ChannelSftp) _channel);
    }
}

实现com.jcraft.jsch.Logger日志,这个日志是jsch本身的日志工具类,和org.apache.log4j.Logger的日志类不一样。

/**
 * 日志工具类
 */
public class SettleLogger implements com.jcraft.jsch.Logger {
    public boolean isEnabled(int level) {
        return true;
    }

    public void log(int level, String msg) {
        System.out.println(msg);
    }
}
这样程序的问题就解决了。。。

`com.jcraft.jsch.JSchException: Auth fail for methods 'password'` 异常通常表示使用密码认证时失败,以下是一些可能的解决方法: ### 检查用户名和密码 确认使用的用户名和密码是否正确。可在 OpenDaylight 的配置文件中查看或修改用户认证信息。一般在 `opendaylight/current/etc/users.properties` 文件中定义用户和密码。示例如下: ```plaintext admin = admin,admin ``` 这里 `admin` 是用户名,等号后面的第一个 `admin` 是密码,`admin` 是用户角色。确保使用的用户名和密码与该文件中的配置一致。 ### 检查网络连接 确保客户端与目标服务器之间的网络连接正常,且对应的端口是开放的。可使用 `telnet` 命令测试端口连通性: ```bash telnet <server_ip> <port> ``` 若无法连接,可能是防火墙阻止了该端口的访问。需检查服务器和客户端的防火墙设置,开放对应的端口。例如,在 Linux 系统中,可使用以下命令开放端口: ```bash sudo firewall-cmd --zone=public --add-port=<port>/tcp --permanent sudo firewall-cmd --reload ``` ### 检查服务状态 确保目标服务正常运行。可使用以下命令检查服务状态: ```bash systemctl status <service_name> ``` 若服务未运行,可使用以下命令启动服务: ```bash systemctl start <service_name> ``` ### 查看日志文件 查看目标服务的日志文件,查找与认证失败相关的详细信息。使用 `grep` 命令过滤日志: ```bash grep "authentication failed" <log_file_path> ``` 根据日志中的错误信息进行相应的处理。 ### 重新创建用户 若问题是由于用户配置异常导致的,可尝试删除原来创建的用户,然后重新创建同名用户,并将原来的数据指定给新创建的用户。以下是具体操作示例: ```bash # 如果已有用户,清除掉 userdel sftp1 rm -rf /home/sftp1 rm -rf /var/spool/mail/sftp1 # 新建sftp组、具体用户sftp1 groupadd sftp adduser sftp1 useradd -G sftp -s /sbin/nologin sftp1 passwd 123456@sftp1 # 修改ssh配置文件 vi /etc/ssh/sshd_config # 找到如下这行,用#符号注释掉。 # Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp UsePAM yes # 用chroot将用户的根目录指定到%h,%h代表用户home目录,这样用户就只能在用户目录下活动。也可用%u,%u代表用户名 ChrootDirectory /data/sftp/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no # 设定Chroot目录权限(必须),用户目录以及组目录以及数据根目录都要设置为755权限,不要太高,否则可能报Permission denied的异常 mkdir -p /data/sftp/sftp1 chown root:root /data/sftp/sftp1 chmod 755 /data -R # 建立SFTP用户登入后可写入的目录upload mkdir /data/sftp/sftp1/upload chown sftp1 /data/sftp/sftp1/upload # 给upload以及下级文件授权777,否则可能报Permission denied的异常 chmod 777 /data/sftp/sftp1/upload -R # 重启ssh service sshd restart ``` ### 检查加密算法匹配性 通常是由于 JSch 库与目标主机之间的加密算法不匹配导致的。SSH 客户端(JSch)和服务器在建立连接时,需要协商使用相同的加密算法(如密钥交换算法、加密算法、MAC 算法等)。如果双方没有共同的算法支持,就会抛出此异常。可参考相关文档调整客户端和服务器的加密算法配置 [^1]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值