问题:使用 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)
错误的输出没有提供任何信息(以及图书馆的稀缺文档)。原因是在连接时管理服务器 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);
}
这些文章有帮助:
在 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");