2011-02-08 59 views
26

Tôi đang sử dụng JSch để giao tiếp sftp, bây giờ tôi muốn sử dụng tạo điều kiện xác thực dựa trên khóa, khóa được tải trên máy khách và máy chủ một lần bởi nhóm mạng của tôi và tất cả giao tiếp sau sẽ chỉ là người dùng mà chúng tôi đã tải Chìa khóa.Chúng ta có thể sử dụng JSch cho giao tiếp dựa trên khóa SSH không?

sftp -oPort=10022 [email protected] 

như [email protected]

như lệnh này làm việc tốt và kết nối với sftp, làm thế nào tôi có thể đạt được chức năng này lập trình.

nếu không thể sử dụng JSch, vui lòng đề xuất một số thư viện khác. Tôi đã xem qua số Apache SSHD.

Trả lời

68

Có thể. Hãy xem JSch.addIdentity(...)

Điều này cho phép bạn sử dụng khóa hoặc làm mảng byte hoặc để đọc nó từ tệp.

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

thực sự tôi không có bất kỳ khóa nào, nó được nạp sẵn trong hệ thống bởi nhóm mạng và giờ tôi có thể kết nối với máy chủ bằng lệnh không có khóa hoặc mật khẩu. –

+1

* Được tải sẵn trong hệ thống * có thể có nghĩa là '.ssh/id_rsa' hoặc tương tự hoặc có cài đặt đặc biệt trong' .ssh/config' cho máy chủ của bạn hoặc bạn đang sử dụng một số chương trình như 'ssh_agent' để đưa ra chìa khóa theo yêu cầu. Khám phá đó là trường hợp của bạn, và thêm nó vào câu hỏi của bạn. –

+0

Vâng Thưa nó thực sự đã giúp tôi. cảm ơn cho các hướng dẫn. –

Các vấn đề liên quan