我正在尝试编写一个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)
导致此错误的原因是什么?我该怎么办?
答案 0 :(得分:35)
我调试了代码。这是失败的,因为我的私钥未通过身份验证;由于我没有指定密码,JSch默默地回到了密码验证,该验证被取消了。
JSch错误处理很糟糕。回溯您的步骤,重新生成(单独的)私钥文件,使用ssh -i
保证您使用正确的文件,并保持手指交叉。
答案 1 :(得分:5)
要使jsch
连接正常工作,您必须指定known_hosts
文件和包含私钥的文件的路径。这是使用setKnownHosts
和addIdentity
方法完成的。
jsch.setKnownHosts("/path/to/.ssh/known_hosts");
jsch.addIdentity("/path/to/.ssh/id_rsa");
如果密钥有密码短语,您可以将其添加到addIdentity
参数列表中:
jsch.addIdentity("/path/to/.ssh/id_rsa", myPassPhrase);
答案 2 :(得分:3)
使用sshexec任务时遇到了同样的问题。我也添加了密码短语,它工作正常。为您的私钥创建密码,并将其作为属性添加到您的任务中。如果您在Windows上使用puttygen生成密钥,也不要忘记将私钥转换为打开ssh格式。
答案 3 :(得分:1)
我今天也有类似的问题。所以我想我也会分享我的解决方案。我得到了同样的例外但问题实际上是我的密码中有一个变音符号。在没有它的情况下选择一个新密码之后一切正常。
答案 4 :(得分:0)
现在有一个全新的Jsch分支。异常处理要全面得多。不再吞咽或违约。前往https://github.com/vngx/vngx-jsch查看它。如果某些内容无法按预期的方式运行,请将其作为一个问题提出,或者在我们积极维护它时发送拉取请求。我们也希望尽快在maven中央回购中获得它。