【问题标题】:"Could not load known_hosts" exception using SSHJ使用 SSHJ 的“无法加载 known_hosts”异常
【发布时间】:2010-09-02 18:37:14
【问题描述】:

我在使用 SSHJ 时遇到异常。

我是这样实现的:

public static void main(String[] args) throws IOException { 
    // TODO Auto-generated method stub 
    final SSHClient ssh = new SSHClient(); 
    ssh.loadKnownHosts(); 
    ssh.connect("serverName"); 
    try{ 
        ssh.authPublickey("myUserId"); 
        final Session session = ssh.startSession(); 
        try{ 
            final Command cmd = session.exec("net send myMachineName Hello!!!"); 
            System.out.println(cmd.getOutputAsString()); 
            System.out.println("\n Exit Status: "+cmd.getExitStatus()); 
        }finally{ 
            session.close(); 
        } 
        }finally{ 
            ssh.disconnect(); 
        }    
    } 

} 

但我得到以下异常:

Exception in thread "main" java.io.IOException: Could not load known_hosts
    at net.schmizz.sshj.SSHClient.loadKnownHosts(SSHClient.java:528)
    at SSHTEST.main(SSHTEST.java:25)

我做错了什么?

【问题讨论】:

    标签: java ssh sshj


    【解决方案1】:

    删除对 loadKnownHosts() 方法的调用,正如 erickson 提到的那样,默认情况下会在 ~/.ssh/known_hosts 下检查(您也可以将位置指定为参数),并将其替换为:

    ssh.addHostKeyVerifier("public-key-fingerprint");
    

    要找出指纹是什么,扭曲的方法是在没有该语句的情况下进行连接 - 你会从异常中找到;-)

    【讨论】:

      【解决方案2】:

      听起来它正在尝试读取“known_hosts”文件,但找不到它,或者它的格式可能无效。

      SSH 已知主机文件记录各种主机的公钥以阻止一些欺骗攻击。通常它位于 ~/.ssh/known_hosts 中。尝试在那里创建一个空文件,看看是否满足库。

      库文档可能会解决必要的配置文件。

      【讨论】:

      • @user234194:在客户端制作文件。服务器通常不会检查客户端来自哪里(那将是一个真正的 PITA)。
      【解决方案3】:

      使用以下代码

      final SSHClient ssh = new SSHClient();  
      
      ssh.addHostKeyVerifier(  
          new HostKeyVerifier() {  
              public boolean verify(String arg0, int arg1, PublicKey arg2) {  
                  return true;  // don't bother verifying  
              }  
          }  
      );  
      
      ssh.connect("LocalHost");
      

      【讨论】:

      • sshj 已经提供了一个验证器,它只接受向它抛出的任何内容,尝试使用: ssh.addHostKeyVerifier(new PromiscuousVerifier());它无需匿名内部类就可以实现相同的功能。
      • 不要这样做。这将盲目地接受远程 SSH 密钥,无论它是否真正受信任。 SSH 协议具有防止中间人攻击的能力。这个 hack 完全绕过了这个功能,并假设一切都是可信的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2013-08-30
      • 2011-08-02
      相关资源
      最近更新 更多