2011-02-08 116 views
26

我正在使用JSch進行sftp通信,現在我想使用基於密鑰的身份驗證方式,密鑰在客戶端和服務器計算機上一次由我的網絡團隊加載,並且以後的所有通信都將僅基於用戶加載鍵。我們可以使用JSch進行SSH密鑰通信嗎?

sftp -oPort=10022 [email protected] 

[email protected]

這樣的命令,做工精細,並連接到SFTP,我如何通過編程實現這一功能。

如果使用JSch是不可能的,請推薦一些其他庫。我碰到Apache SSHD

回答

68

這是可能的。看看JSch.addIdentity(...)

這使您可以使用鍵作爲字節數組或從文件中讀取它。

import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelSftp; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 

public class UserAuthPubKey { 
    public static void main(String[] arg) { 
     try { 
      JSch jsch = new JSch(); 

      String user = "tjill"; 
      String host = "192.18.0.246"; 
      int port = 10022; 
      String privateKey = ".ssh/id_rsa"; 

      jsch.addIdentity(privateKey); 
      System.out.println("identity added "); 

      Session session = jsch.getSession(user, host, port); 
      System.out.println("session created."); 

      // disabling StrictHostKeyChecking may help to make connection but makes it insecure 
      // see http://stackoverflow.com/questions/30178936/jsch-sftp-security-with-session-setconfigstricthostkeychecking-no 
      // 
      // java.util.Properties config = new java.util.Properties(); 
      // config.put("StrictHostKeyChecking", "no"); 
      // session.setConfig(config); 

      session.connect(); 
      System.out.println("session connected....."); 

      Channel channel = session.openChannel("sftp"); 
      channel.setInputStream(System.in); 
      channel.setOutputStream(System.out); 
      channel.connect(); 
      System.out.println("shell channel connected...."); 

      ChannelSftp c = (ChannelSftp) channel; 

      String fileName = "test.txt"; 
      c.put(fileName, "./in/"); 
      c.exit(); 
      System.out.println("done"); 

     } catch (Exception e) { 
      System.err.println(e); 
     } 
    } 
} 
+0

其實我沒有任何密鑰,它是由網絡小組預先加載到系統中的,現在我可以使用沒有密鑰或密碼的命令連接到服務器。 – 2011-02-08 11:37:23

相關問題