2010-09-02 11 views
7

Ricevo un'eccezione durante l'utilizzo di SSHJ."Impossibile caricare l'eccezione known_hosts" utilizzando SSHJ

Ecco come ho implementato è:

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(); 
     }  
    } 

} 

Ma ho la seguente eccezione:

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) 

Che cosa sto facendo di sbagliato?

risposta

5

Rimuovere la chiamata a loadKnownHosts() metodo, che come detto Erickson controlli in ~/.ssh/known_hosts di default (è possibile specificare la posizione come un argomento come bene però), e sostituirlo con:

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

per scoprire che cosa l'impronta digitale è, il modo contorto sarebbe quello di connettersi senza quella dichiarazione - scoprirete l'eccezione ;-)

2

Sembra che stia cercando di leggere un file "known_hosts", ma non riesce a trovarlo, o forse in un formato non valido.

Il file host noto SSH registra la chiave pubblica per vari host per contrastare alcuni attacchi di spoofing. Normalmente risiede in ~/.ssh/known_hosts. Prova a creare un file vuoto lì e vedi se soddisfa la libreria.

È probabile che la documentazione della libreria indirizzi i file di configurazione necessari.

+0

Dove nel server? – user234194

+0

@ user234194: crea il file sul client. Il server normalmente non controlla da dove proviene il client (sarebbe una vera PITA). –

15

Utilizzare il codice folowing

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"); 
+12

sshj fornisce già un verificatore che accetta solo ciò che viene lanciato, prova a utilizzare: ssh.addHostKeyVerifier (new PromiscuousVerifier()); Raggiungerà la stessa cosa senza la necessità della classe interiore anonima. –

Problemi correlati