JSCH通道未开通(新)

问题描述 投票:0回答:2

问题:使用 JSCH 库通过 SFTP 连接远程站点会导致“通道未打开”。代码在一个互联网连接上工作正常,但在另一个互联网连接上则失败。另一种是通过代理完成的。尽管如此,我可以使用 FileZilla 客户端通过 SFTP 从另一个连接。

研究:尝试增加连接超时并设置 useDNS: false 来自类似的问题。我已经从中打开了会话和频道。尽管如此,超时后,通道连接失败。

问题:如何建立连接。

下面是代码和错误堆栈跟踪摘录:

  JSch jsch = new JSch();
  UserInfo userInfo ;

  jsch.setKnownHosts(KNOWN_HOSTS);

  session = jsch.getSession(
    Menue.SITE_LOGIN,
    Menue.SITE_HOST,
    Menue.SITE_PORT);

  session.setPassword(
    Menue.SITE_PASSWORD);

  if (Menue.USE_PROXY) {
    session.setProxy(
      new ProxyHTTP(
        Menue.PROXY_HOST,
        Menue.PROXY_PORT));
  }

  session.setConfig(
    "StrictHostKeyChecking",
    "yes");

  session.connect();
  channel = session.openChannel("sftp");
  channel.setInputStream(System.in);
  channel.setOutputStream(System.out);
  channel.connect(60 * 1000); // Error: channel is not opened.

堆栈跟踪:

com.jcraft.jsch.JSchException:通道未打开。在 com.jcraft.jsch.Channel.sendChannelOpen(Channel.java:765) 在 com.jcraft.jsch.Channel.connect(Channel.java:151)

jsch channel
2个回答
0
投票

错误的输出没有提供任何信息(以及图书馆的稀缺文档)。原因是在连接时管理服务器 rsa 密钥。我想要没有用户界面对话框和完全自动化(禁用UserInfo)。

另外 StrickedHostKeyChecking 应该是 no ,尽管它不安全。将其设置为“no”允许将 rsa 密钥自动添加到本地密钥存储库(例如 ~/.ssh/known_hosts)。

最终得到了代码:

try {
  JSch jsch = new JSch();

  jsch.setKnownHosts("~/.ssh/known_hosts");

  Session session = jsch.getSession(
    "my_login",
    "my.host",
    22);

  session.setPassword(
    "password");

  // Autoadd system rsa-keys to system file like known_hosts by
  // disabling strick keys checking:
  java.util.Properties config = new java.util.Properties();
  config.put(
    "StrictHostKeyChecking",
    "no");
  session.setConfig(config);

  session.connect();

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

  System.out.println(
        sftpChannel.ls("/"));

  session.disconnect();
} catch (Exception e) {
  System.out.println(e);
}

这些文章有帮助:

KnownHosts 上的原始示例

将 rsa 添加到known_hosts

未知的主机密钥管理


0
投票

在 Windows 上,我在以下位置找到了已知主机的目录:

C:\users\myusername.ssh\

但是没有通过登录我尝试通过 putty 连接到的服务器并使用以下命令构建我自己的known_hosts 文件:

ssh-keyscan -t rsa localhost

然后得到这个:localhost ssh-rsa REALLYLONGSTRINGHERE 右键单击 Putty 的顶部工具栏,然后选择全部复制。然后将其粘贴到文本编辑器中并进行编辑,使其看起来像这样:

serverip ssh-rsa REALLYLONGSTRINGHERE

将其另存为 C:\users\myusername.ssh\known_hosts

然后在你的java代码中添加这一行:

jsch.setKnownHosts("C:/users/myusername/.ssh/known_hosts");
© www.soinside.com 2019 - 2024. All rights reserved.