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

时间:2010-05-25 00:24:25

标签: ant ssh jsch

我正在尝试编写一个Ant脚本来通过端口隧道检索URL。

当我使用密码(名字xxxx出于隐私)时,效果很好:

<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>

我得到了这个例外:

/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)
  • 我确定我使用的是正确的密钥文件(我尝试使用错误的名称,这会产生合法的FileNotFoundException)。
  • 我可以从命令行成功ssh而不会被提示输入密码。
  • 我确定我正在使用密钥文件的正确密码。

导致此错误的原因是什么?我该怎么办?

5 个答案:

答案 0 :(得分:35)

我调试了代码。这是失败的,因为我的私钥未通过身份验证;由于我没有指定密码,JSch默默地回到了密码验证,该验证被取消了。

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

答案 1 :(得分:5)

要使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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

现在有一个全新的Jsch分支。异常处理要全面得多。不再吞咽或违约。前往https://github.com/vngx/vngx-jsch查看它。如果某些内容无法按预期的方式运行,请将其作为一个问题提出,或者在我们积极维护它时发送拉取请求。我们也希望尽快在maven中央回购中获得它。