我正在使用Jsch(Jcraft)库与SSH服务器建立SSH连接,如下所示:
JSch jsch = new JSch();
String user = "****";
String host = "****";
int port = 22;
String privateKey = "***.ppk";//Path to private key(The file is in .ppk format)
try
{
jsch.addIdentity(privateKey);
Session session = jsch.getSession(user, host, port);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
sftpChannel.connect();
/*file transfer code*/
sftpChannel.disconnect();
session.disconnect();
}
catch (Exception e)
{
e.printStackTrace();
}
成功建立SSH连接,因为“StrictHostKeyChecking”已禁用。如果启用,我会收到以下错误:
com.jcraft.jsch.JSchException: UnknownHostKey: ******. RSA key f
is *************
at com.jcraft.jsch.Session.checkHost(Session.java:805)
at com.jcraft.jsch.Session.connect(Session.java:345)
at com.jcraft.jsch.Session.connect(Session.java:183)
我知道我们需要在代码中设置知道主机文件,如下所示:
jsch.setKnownHosts(knownHostsFileName);
我无法通过以下命令生成known_hosts文件:
ssh-keyscan <HOST> > known_hosts
抛出以下错误:
'ssh-keyscan' is not recognized as an internal or external command,
operable program or batch file.
我只有.ppk格式的公钥和私钥。我没有known_host文件。
我们如何创建known_host文件?
为什么 ssh-keyscan 命令抛出错误 - 未被识别为内部/外部命令?
答案 0 :(得分:1)
ssh-keyscan
是Linux / Unix上的命令。为了在Windows上执行它,您需要一个已修改的版本以在Windows上运行。最简单的方法是安装git-for-windows(download)并打开Git Bash
。在此控制台内,您可以使用ssh-keyscan
命令。
答案 1 :(得分:0)
此文件通常由ssh-keyscan
创建,或由用户与SSH主机的连接创建。
您可以通过命令
简单地创建它ssh-keyscan [host]
并保存输出。 -H
选项可以启用哈希输出,但我不知道相关库是否可以使用它。
请注意,如果没有先验证主机指纹,known_hosts
文件本身并不是很有用。以下注意事项直接来自ssh-keyscan
手册页:
SECURITY If an ssh_known_hosts file is constructed using ssh-keyscan without veri- fying the keys, users will be vulnerable to man in the middle attacks. On the other hand, if the security model allows such a risk, ssh-keyscan can help in the detection of tampered keyfiles or man in the middle attacks which have begun after the ssh_known_hosts file was created