【问题标题】:How do I authenticate programmatically using jsch?如何使用 jsch 以编程方式进行身份验证?
【发布时间】:2013-09-21 01:26:03
【问题描述】:

我想通过 sftp 将文件上传到远程服务器。我正在使用 Jsch 库。下面的代码有效,但我总是必须通过输出控制台输入用户名和密码,即使我已经在 Session 对象中设置了这些值。我在 Stack Overflow 和 Jsch 示例 page 上看到的每个示例都需要用户输入。有没有办法以编程方式传递密码? (我需要通过用户名/密码进行身份验证。我不能使用 SSH 密钥...)

    JSch jsch = new JSch();
    ChannelSftp sftpChannel;
    Session session;
    Channel channel;
    OutputStream os;

    try {

        session = jsch.getSession("myUsername", "myHost", 22);
        session.setPassword("myPassword");
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();

        channel = session.openChannel("sftp");
        channel.connect();
        sftpChannel = (ChannelSftp) channel;
        os = sftpChannel.getOutputStream();

    } catch (Exception e) {
    }

【问题讨论】:

  • 你读过这个话题吗:stackoverflow.com/questions/5561862/…
  • 您提供的链接中的代码没有自动将凭据传递给主机服务器。仍然提示用户进行身份验证...
  • 如果您将“promptYesNo()”方法更改为返回 false 而不是 true(在 SftpUserInfo 类中)
  • 我不确定你是否还需要这个来回答。经过更长的时间后,我发现了一些有用的东西。请点击链接“stackoverflow.com/a/47290119/1376581”。但是,直接在代码中传递密码时应该小心。 jar和示例代码将帮助您通过代码自动运行ssh命令,不会出现用户提示。

标签: java ssh jsch


【解决方案1】:

您可以使用用户名和密码设置工厂并使用它来创建会话:

    final DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
    factory.setHost(...);
    factory.setPort(...);
    factory.setUser(..);
    factory.setPassword(...);
    factory.setAllowUnknownKeys(true);
    final Session session = factory.getSession();

看看 Spring Integration,他们已经将 ftp 抽象为一个相当不错的消息传递网关(这里不再赘述,因为它与问题没有直接关系)

【讨论】:

    【解决方案2】:

    您需要添加以下代码:

    jsch.addIdentity("<Key_path>"); // replace the key_path with actual value
    session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
    

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2015-01-08
      • 2018-10-12
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 2019-11-26
      相关资源
      最近更新 更多