Jsch 已知主机不工作
Jsch Known Hosts not working
好的,我收到 UnknownHostKey 异常。我不想像 post com.jcraft.jsch.JSchException: UnknownHostKey 那样使用 StrictHostKeyChecking=no 来解决问题。我希望 JSCH 使用系统 ssh 使用的已知主机文件。可能吗?
是的,这是可能的,在建立 JSCH 连接时,您需要设置 knownHosts 文件位置:
示例 JSCH 连接代码:
JSch jsch = new JSch();
jsch.setKnownHosts(propertyReader.getKnownHosts());
session = jsch.getSession(propertyReader.getUsername(),
propertyReader.getSftpLocation(), 22);
session.setPassword(propertyReader.getPassword());
session.connect();
channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftp = (ChannelSftp) channel;
if (!StringUtils.isBlank(fileToPut)) {
sftp.put(fileToPut, propertyReader.getSftpDirectory() + "/"
+ newFileName);
} else {
sftp.put(propertyReader.getSftpDirectory() + "/" + newFileName,
ChannelSftp.OVERWRITE);
}
这里的propertyReader是class设置所有sftp物流的位置
已知主机文件将位于用户的 ~/.ssh 目录内,java 程序与之 运行ning :
/home/<username>/.ssh/known_hosts
要将远程 sftp 服务器添加到已知主机文件,您可以先在服务器上使用常规 sftp 命令执行手动 sftp,您需要使用 运行 java 进程同一用户:
sftp username@host
然后提供密码。或者如果使用密钥:
sftp -i KEYFILE.pem username@host
如果建立连接,它会提示您将主机添加到已知主机中,回答是。
将主机注册到已知hosts文件后,使用java程序连接。
在下面找到另一种方法来提供 known_hosts 文件的完整路径
如前所述,我们必须提供 known_hosts 文件的完整路径,例如 '/home//.ssh/known_hosts'
对于下面的示例,我们不需要为特定用户硬编码路径。它将使用 $HOME 系统变量为当前用户生成文件的位置。
同样,我们必须第一次在服务器上手动发出 sftp 命令(例如通过 Putty)以更新 known_hosts 文件。
private static ChannelSftp getChannel (String user, String passwd, String host, int port, String IdentityFile, String PassPhrase) throws JSchException
{
// set dbms_java.set_output(1000000); -- in PL/SQL to read messages
System.out.println("user: " + user);
System.out.println("passwd: " + passwd);
System.out.println("host: " + host);
System.out.println("port: " + port);
System.out.println("IdentityFile: " + IdentityFile);
System.out.println("PassPhrase: " + PassPhrase);
// --
JSch jsch = new JSch();
String HOME = String.valueOf(System.getenv("HOME"));
String knownHostsFileName = Paths.get(HOME, ".ssh", "known_hosts").toString();
System.out.println("knownHostsFileName: " + knownHostsFileName);
if (knownHostsFileName != null && new File(knownHostsFileName).exists()) {
jsch.setKnownHosts(knownHostsFileName);
System.out.println("KnownHostsFile added");
}
if (IdentityFile != null && new File(IdentityFile).exists()) {
jsch.addIdentity(IdentityFile, PassPhrase);
System.out.println("IdentitFile added");
}
Session session = jsch.getSession(user, host, port);
System.out.println("jsch.getSession");
session.setPassword(passwd);
System.out.println("setPassword");
/* // It is necessary if we want to turn off known_hosts checking
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
config.put("PreferredAuthentications", "publickey,password");
session.setConfig(config); */
session.connect();
System.out.println("session.connect");
Channel channel = session.openChannel("sftp");
System.out.println("session.openChannel-sftp");
channel.connect();
System.out.println("channel.connect");
return (ChannelSftp) channel;
}
好的,我收到 UnknownHostKey 异常。我不想像 post com.jcraft.jsch.JSchException: UnknownHostKey 那样使用 StrictHostKeyChecking=no 来解决问题。我希望 JSCH 使用系统 ssh 使用的已知主机文件。可能吗?
是的,这是可能的,在建立 JSCH 连接时,您需要设置 knownHosts 文件位置:
示例 JSCH 连接代码:
JSch jsch = new JSch();
jsch.setKnownHosts(propertyReader.getKnownHosts());
session = jsch.getSession(propertyReader.getUsername(),
propertyReader.getSftpLocation(), 22);
session.setPassword(propertyReader.getPassword());
session.connect();
channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftp = (ChannelSftp) channel;
if (!StringUtils.isBlank(fileToPut)) {
sftp.put(fileToPut, propertyReader.getSftpDirectory() + "/"
+ newFileName);
} else {
sftp.put(propertyReader.getSftpDirectory() + "/" + newFileName,
ChannelSftp.OVERWRITE);
}
这里的propertyReader是class设置所有sftp物流的位置 已知主机文件将位于用户的 ~/.ssh 目录内,java 程序与之 运行ning :
/home/<username>/.ssh/known_hosts
要将远程 sftp 服务器添加到已知主机文件,您可以先在服务器上使用常规 sftp 命令执行手动 sftp,您需要使用 运行 java 进程同一用户:
sftp username@host
然后提供密码。或者如果使用密钥:
sftp -i KEYFILE.pem username@host
如果建立连接,它会提示您将主机添加到已知主机中,回答是。
将主机注册到已知hosts文件后,使用java程序连接。
在下面找到另一种方法来提供 known_hosts 文件的完整路径
如前所述,我们必须提供 known_hosts 文件的完整路径,例如 '/home/
对于下面的示例,我们不需要为特定用户硬编码路径。它将使用 $HOME 系统变量为当前用户生成文件的位置。
同样,我们必须第一次在服务器上手动发出 sftp 命令(例如通过 Putty)以更新 known_hosts 文件。
private static ChannelSftp getChannel (String user, String passwd, String host, int port, String IdentityFile, String PassPhrase) throws JSchException
{
// set dbms_java.set_output(1000000); -- in PL/SQL to read messages
System.out.println("user: " + user);
System.out.println("passwd: " + passwd);
System.out.println("host: " + host);
System.out.println("port: " + port);
System.out.println("IdentityFile: " + IdentityFile);
System.out.println("PassPhrase: " + PassPhrase);
// --
JSch jsch = new JSch();
String HOME = String.valueOf(System.getenv("HOME"));
String knownHostsFileName = Paths.get(HOME, ".ssh", "known_hosts").toString();
System.out.println("knownHostsFileName: " + knownHostsFileName);
if (knownHostsFileName != null && new File(knownHostsFileName).exists()) {
jsch.setKnownHosts(knownHostsFileName);
System.out.println("KnownHostsFile added");
}
if (IdentityFile != null && new File(IdentityFile).exists()) {
jsch.addIdentity(IdentityFile, PassPhrase);
System.out.println("IdentitFile added");
}
Session session = jsch.getSession(user, host, port);
System.out.println("jsch.getSession");
session.setPassword(passwd);
System.out.println("setPassword");
/* // It is necessary if we want to turn off known_hosts checking
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
config.put("PreferredAuthentications", "publickey,password");
session.setConfig(config); */
session.connect();
System.out.println("session.connect");
Channel channel = session.openChannel("sftp");
System.out.println("session.openChannel-sftp");
channel.connect();
System.out.println("channel.connect");
return (ChannelSftp) channel;
}