我可以使用JSCH将远程主机重新添加到known_host吗?

时间:2013-03-26 16:30:15

标签: java jsch

我希望能够从known_hosts中删除远程服务器密钥并再次添加。远程服务器经常更新,因此我想自动删除远程主机密钥并将其新密钥添加到known_hosts。我可以从known_hosts中删除密钥,虽然它很笨重并且使用Process而不是通过JSCH。这有效,但每当我尝试访问服务器时都会遇到此消息:

The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is 10:10:30:00:e7:0c:d3:18:cf:ac:42:e2:f3:51:25:bg.
Are you sure you want to continue connecting (yes/no)? 

我知道可以使用UserInfo来解决此消息,但我使用其他方式连接到远程服务器,例如Process,并且当我运行这些命令时会出现消息。

是否可以使用JSCH从known_hosts中删除并添加主机ID?

虽然不使用jsch可能相关:

How can I write a program (script) to remove obsolete host keys from ~/.ssh/known_hosts?

2 个答案:

答案 0 :(得分:6)

是的,您可以使用JSch将远程主机条目添加到known_hosts文件中。正如Jim Garrison回答的那样,还有其他方法可以解决这个问题,但是这里是如何在你的代码中做到的:

首先,要理解默认情况下,如果你没有指定known_hosts文件,JSch仍然可以工作,它只会在内存中创建一个运行时的known_host文件,并且只要Strict Host Key Checking是自动添加的设为'不'。

如果您指定了已知主机文件,那么当严格主机密钥检查设置为“否”时,JSch将向该文件添加新条目

        JSch jsch = new JSch();

        jsch.setKnownHosts(knownHostsFile);
        logger.info("known hosts file set: " + knownHostsFile);

        jsch.addIdentity(privateKey);
        logger.info("rsa private key loaded: " + privateKey);

        Session session = jsch.getSession(user, host, port);
        java.util.Properties config = new java.util.Properties();

        // this setting will cause JSCH to automatically add all target servers' entry to the known_hosts file
        config.put("StrictHostKeyChecking", "no");  
        session.setConfig(config);

        session.connect();

这不是一种非常安全的行为,但它是让JSCh为您设置新服务器条目的便捷方式。在设置了已知的主机文件后,我建议将StrictHostKeyChecking恢复为是。

答案 1 :(得分:0)

无需以编程方式操纵known_hosts

ssh -oStrictHostKeyChecking=no remote-host

或添加

StrictHostKeyChecking no

~/.ssh/config。有关详细信息,请阅读ssh_config(5)手册页。