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

Dan*_*ich 20 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>
Run Code Online (Sandbox Code Playgroud)

但是当我使用密钥文件时它不起作用,如下所示:

    <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>
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

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

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

Dan*_*ich 36

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

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


Osc*_*avo 5

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

        jsch.setKnownHosts("/path/to/.ssh/known_hosts");
        jsch.addIdentity("/path/to/.ssh/id_rsa");
Run Code Online (Sandbox Code Playgroud)

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

        jsch.addIdentity("/path/to/.ssh/id_rsa", myPassPhrase);
Run Code Online (Sandbox Code Playgroud)

见Javadocs