jsch session.connect()问题

时间:2012-05-17 14:24:05

标签: java sftp jsch

我是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连接,我的公钥是否必须在同一目录中?有没有办法获得有关我失败的更多信息?

由于

3 个答案:

答案 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(); }