com.jcraft.jsch.JSchException:身份验证取消

问题描述:

我试图编写一个Ant脚本来通过端口隧道检索URL。com.jcraft.jsch.JSchException:身份验证取消

<project default="main"> 
    <target name="main"> 
    <sshsession host="xxxx" 
    username="xxxx" 
    password="xxxx"> 
     <LocalTunnel lport="1080" rhost="xxxx" rport="80"/> 
     <sequential> 
     <get src="http://localhost:1080/xxxx" dest="/tmp/xxxx"/> 
     </sequential> 
    </sshsession> 
    </target> 
</project> 

但它不工作,当我使用一个密钥文件,像这样:

<sshsession host="xxxx" 
    username="xxxx" 
    keyfile="/Users/xxxx/.ssh/id_dsa" 
    passphrase="xxxx"> 
     <LocalTunnel lport="1080" rhost="xxxx" rport="80"/> 
     <sequential> 
     <get src="http://localhost:1080/xxxx" dest="/tmp/xxxx"/> 
     </sequential> 
    </sshsession> 

它,当我使用一个密码(xxxx'd了对隐私的名字)的伟大工程

我得到这个异常:

/tmp/build.xml:8: com.jcraft.jsch.JSchException: Auth cancel 
    at com.jcraft.jsch.Session.connect(Session.java:451) 
    at com.jcraft.jsch.Session.connect(Session.java:150) 
    at org.apache.tools.ant.taskdefs.optional.ssh.SSHBase.openSession(SSHBase.java:223) 
  • 我敢肯定,我用c orrect keyfile(我尝试使用错误的名称,这给了一个合法的FileNotFoundException)。
  • 我可以从命令行成功ssh而不需要提示输入密码。
  • 我确定我正在使用密钥文件的正确密码。

这个错误的原因是什么,我该怎么办?

+0

唉,我下载的源,它似乎是Jsch燕子的原因JSchAuthCancelException,并且只报告“AuthCancel”。任何人都想调试它? – 2010-05-25 00:28:41

我调试了代码。这是失败的,因为我的私钥失败了身份验证; JSch无声地回到了密码认证,这被取消了,因为我没有指定密码。

JSch错误处理很糟糕。重新执行您的步骤,重新生成(单独的)私钥文件,使用ssh -i以确保您使用正确的文件,并保持手指交叉。

现在有一个Jsch的新品种。异常处理更全面。没有更多的吞咽或默认。前往https://github.com/vngx/vngx-jsch查看。如果某些事情按照您的预期行不通,请将其作为问题提出来,或者在我们积极维护它时发送拉取请求。我们也希望尽快在Maven中心回购中获得它。

+0

这个声明与这个问题上写的内容矛盾,说vngx-jsch不是替换ant任务的一个下拉选择https://github.com/vngx/vngx-jsch/issues/10 – opticyclic 2013-04-10 17:47:53

+0

这个评论没有任何形式表明它是替代品的下降......它说,如果某件事情按你期望的方式工作,那就意味着基于不基于JSCH的文档。因此,第一行:现在有一个全新的Jsch FORK。该问题因为按照设计工作而关闭。 – Scott 2013-04-11 15:54:49

我在使用sshexec任务时遇到同样的问题。我也添加了密码语句attibute,它工作正常。为您的私钥创建一个密码并将其添加为您的任务中的一个属性。如果您在Windows上使用puttygen生成密钥,请不要忘记将私钥转换为打开的ssh格式。

我今天有类似的问题。所以我想我会分享我的解决方案。我得到了同样的例外,但问题是我的密码中有变音符号。在没有它的情况下选择新密码后,一切正常。

要使jsch连接正常工作,您必须指定到文件known_hosts和包含私钥的文件的路径。这是通过使用setKnownHostsaddIdentity方法完成的。

 jsch.setKnownHosts("/path/to/.ssh/known_hosts"); 
     jsch.addIdentity("/path/to/.ssh/id_rsa"); 

如果该键有一个密码,你可以把它添加到addIdentity参数列表:

 jsch.addIdentity("/path/to/.ssh/id_rsa", myPassPhrase); 

See Javadocs