【问题标题】:"com.jcraft.jsch.JSchException: Auth fail" with working passwords“com.jcraft.jsch.JSchException:身份验证失败”,密码有效
【发布时间】:2013-06-17 13:39:07
【问题描述】:

在尝试将文件上传到我们的服务器时,我收到以下异常

    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 键。 可能是什么错误?

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

【问题讨论】:

  • 您确定您的 java 程序可以找到并读取密钥文件吗?
  • 是的,以超级用户身份运行程序。
  • > id_dsa 不应该是 id_rsa 吗?

标签: java jsch


【解决方案1】:

追根溯源,我终于发现远程服务器上的授权密钥中没有添加类型为 dsa 的公钥。附加相同的内容对我有用。

ssh 正在使用 rsa 密钥,导致我回头查看我的代码。

谢谢大家。

【讨论】:

  • 如果我能回答这个问题,我会给你一个赏金!
  • 我认为只有公钥应该添加到授权密钥而不是私钥。向所有人致敬:(
  • 感谢您对多年前的问题的评论,期待您在此处进行编辑。请做出贡献并使stackoverflow变得更好,而不是批评。 :) @AjayLohani
【解决方案2】:

尝试如下显式添加 auth 方法,因为有时它是必需的:

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

【讨论】:

    【解决方案3】:

    我也面临 Auth Fail 问题,我的代码的问题是我有

    channelSftp.cd("");
    

    改成

    channelSftp.cd(".");
    

    然后就可以了。

    【讨论】:

      【解决方案4】:

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

      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();   
      
          }
      
      }
      

      【讨论】:

        【解决方案5】:

        如果用户名/密码包含任何特殊字符,则在骆驼配置中使用 RAW 来配置值,例如

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

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

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

        http://camel.apache.org/how-do-i-configure-endpoints.html

        【讨论】:

          【解决方案6】:

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

          很高兴知道你在哪里找到了这个问题。

          据我所知并根据com.jcraft.jsch.JSchException: Auth cancel 尝试在方法.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;
          }
          

          【讨论】:

          【解决方案7】:

          就我而言,我使用的是以下依赖项

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

          并获得相同的 Auth 异常失败,但更新了对以下版本的依赖关系,问题得到解决。

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

          【讨论】:

            猜你喜欢
            • 2015-04-08
            • 1970-01-01
            • 2013-11-27
            • 1970-01-01
            • 2013-01-02
            • 2020-09-04
            • 1970-01-01
            • 1970-01-01
            • 2011-07-23
            相关资源
            最近更新 更多