20

我正在尝试编写一个 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 而不会提示输入密码。
  • 我确定我为密钥文件使用了正确的密码。

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

4

5 回答 5

38

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

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

于 2010-05-26T03:11:24.957 回答
5

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

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

如果密钥有密码,您可以将其添加到addIdentity参数列表中:

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

请参阅 Javadocs

于 2014-01-24T10:03:13.277 回答
3

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

于 2011-10-24T21:35:30.327 回答
1

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

于 2012-05-11T16:36:29.803 回答
0

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

于 2011-03-20T01:58:23.823 回答