Java &引用;com.jcraft.jsch.JSchException:Auth fail“;使用工作密码

Java &引用;com.jcraft.jsch.JSchException:Auth fail“;使用工作密码,java,jsch,Java,Jsch,在尝试将文件上载到服务器时,我遇到以下异常 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 FtpService.transferFileToReciever(FtpService.java:

在尝试将文件上载到服务器时,我遇到以下异常

    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 FtpService.transferFileToReciever(FtpService.java:80)
        at FtpService.transferFileToReciever(FtpService.java:54)
        at FtpService.transferFileToRecievers(FtpService.java:44)
        at FtpService.transferSingeFile(FtpService.java:241)
        at FtpService.main(FtpService.java:26)
    Auth fail
函数transferFileToReciever的源文件部分是

        JSch jsch = new JSch();
        jsch.addIdentity("/root/.ssh/id_dsa");
        Session session = jsch.getSession(username, host, 22);

        session.setUserInfo(serverinfo);
        session.connect(); //geting exception here

        boolean ptimestamp = true;
密码是有效的,因为我可以使用ssh登录,但是使用JSCh,即使提供了密钥、用户名和密码,它也不起作用。 在java版本“1.6.0_25”中使用id_dsa密钥。 可能是什么错误

找到了其他类似的问题,但没有找到答案。 提前谢谢

找到了其他类似的问题,但没有找到答案

如果你知道你在哪里发现了这个问题,那会很有趣

据我记忆所及 尝试向方法
.addIdentity()
添加密码短语。如果生成的密钥文件没有密钥文件,则可以使用
”。 另一个错误源是指纹字符串。如果不匹配,您也将获得身份验证失败(取决于目标服务器)

最后这里是我的工作源代码——在我能够解决难看的管理任务之后:

public void connect(String host, int port, 
                    String user, String pwd,
                    String privateKey, String fingerPrint,
                    String passPhrase
                  ) throws JSchException{
    JSch jsch = new JSch();

    String absoluteFilePathPrivatekey = "./";
    File tmpFileObject = new File(privateKey);
    if (tmpFileObject.exists() && tmpFileObject.isFile())
    {
      absoluteFilePathPrivatekey = tmpFileObject.getAbsolutePath();
    }

    jsch.addIdentity(absoluteFilePathPrivatekey, passPhrase);
    session = jsch.getSession(user, host, port);

    //Password and fingerprint will be given via UserInfo interface.
    UserInfo ui = new UserInfoImpl(pwd, fingerPrint);
    session.setUserInfo(ui);

    session.connect();

    Channel channel = session.openChannel("sftp");
    channel.connect();
    c = (ChannelSftp) channel;
}

追踪根本原因,我最终发现dsa类型的公钥没有添加到远程服务器上的授权密钥中。加上同样的东西对我很有效

ssh使用的是rsa密钥,这让我回顾了我的代码


谢谢大家。

示例案例,当我从远程服务器获取文件并将其保存在本地计算机中时
封装连接器

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class Main {

    public static void main(String[] args) throws JSchException, SftpException, IOException {
        // TODO Auto-generated method stub
        String username = "XXXXXX";
        String host = "XXXXXX";
        String passwd = "XXXXXX";
        JSch conn = new JSch();
        Session session = null;
        session = conn.getSession(username, host, 22);
        session.setPassword(passwd);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();

        ChannelSftp channel = null;
        channel = (ChannelSftp)session.openChannel("sftp");
        channel.connect();

        channel.cd("/tmp/qtmp");

        InputStream in = channel.get("testScp");
        String lf = "OBJECT_FILE";
        FileOutputStream tergetFile = new FileOutputStream(lf);

        int c;
        while ( (c= in.read()) != -1 ) {
            tergetFile.write(c);
        } 

        in.close();
        tergetFile.close();

        channel.disconnect();
        session.disconnect();   

    }

}

我还面临身份验证失败的问题,我的代码的问题是

channelSftp.cd("");
改成

channelSftp.cd(".");

然后它就会工作。

如果用户名/密码包含任何特殊字符,那么在camel配置中使用RAW来配置如下值

  • RAW(se+re-t&23)
    其中
    se+re-t&23
    是实际密码

  • RAW({abc.ftp.password})
    其中
    {abc.ftp.password}
    值来自spring属性文件

通过使用RAW,解决了我的问题


尝试按如下方式显式添加auth方法,因为有时需要它:

session.setConfig("PreferredAuthentications", "password");

在我的例子中,我使用了下面的依赖项

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.42</version>
</dependency> 

com.jcraft
jsch
0.1.42
获得相同的Auth fail异常,但将依赖项更新到以下版本,问题得到解决

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.54</version>
</dependency>

com.jcraft
jsch
0.1.54

你确定你的java程序可以找到并读取密钥文件吗?是的,以超级用户身份运行该程序。>id_dsa不应该是id_rsa吗?通过谷歌搜索确切的例外情况,出现的链接是我会尝试一下,并让你知道:)如果我能回答这个问题,我会给你一笔奖金!我认为只有公钥应该添加到授权密钥中,而不是私钥。向所有人致敬:(感谢您对这一由来已久的问题发表的评论,期待您的编辑。请发表意见,让stackoverflow变得更好,而不是批评。@AjayLohani