我是Jsch的新手,我正试图通过sftp连接到第三方。我可以通过ssh连接所以我知道我有正确的用户,主机,端口和私钥文件,但是当我尝试通过Jsch连接时,我收到异常消息“Auth failed”,这几乎是,但不是很有帮助。这是我在网上的例子拼凑的代码:
String pvtkey = "{unixpath}/id_dsa";
ChannelSftp sftp = null;
JSch jsch = new JSch();
Session session = null;
try{
jsch.setKnownHosts("{unixpath}/known_hosts");
jsch.addIdentity(pvtkey);
session = jsch.getSession(user, connectionURL, 22);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
...some other code that never gets called
}catch(JSchException e){
log.info(e.getMessage());
log.error(e.getCause());
}
我添加了一些日志,所以我知道失败发生在session.connect()。我抓住了用户和connectionURL,并确认他们正在正确传递。 pvtkey和known_hosts的路径是我保存密钥和托管文件的完整unix路径,我已将其移动到保存脚本的目录,从而启动此过程。我对sftp仍然有点新,即使我没有将它添加到Jsch连接,我的公钥是否必须在同一目录中?有没有办法获得有关我失败的更多信息?
由于
答案 0 :(得分:0)
是的,如果您正在使用公钥认证,那么JSch期望公共密钥文件位于同一目录中(并且添加了.pub
的同名)作为您作为参数传递的私钥文件addIdentity()
。或者,您可以使用the method variant which takes both file names as parameters,或将它们作为字节数组传递。
原因是在SSH公钥认证协议中,客户端首先向服务器发送可用公钥的列表,然后服务器中的服务器选择一个合适的公钥 - 只需要私钥(并且将需要私钥)如有必要,可以解密)。 虽然它(取决于算法和键表示)可能可以从私有计算公钥,但JSch本身不会这样做,所以你必须提供两个键。
答案 1 :(得分:0)
因为你正在使用
config.put("StrictHostKeyChecking", "no");
你不需要任何密钥文件。它会禁用主机密钥检查。你可以显示执行程序后日志的内容。我们可以帮助你。
答案 2 :(得分:0)
使用以下代码为我代劳:
try { Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); config.put("PreferredAuthentications", "publickey,keyboard-interactive,password"); jsch.addIdentity(); System.out.println("identity added "); session = jsch.getSession(user, host, 22); // session.setPassword("123"); session.setConfig(config); session.connect(); Channel channel = session.openChannel("sftp"); channel.connect(); } catch (JSchException e) { e.printStackTrace();
} catch (SftpException e) { e.printStackTrace(); }