2011-02-08 18 views
26

मैं sftp संचार के लिए JSch का उपयोग कर रहा हूं, अब मैं कुंजी-आधारित प्रमाणीकरण को सुविधाजनक बनाने के लिए उपयोग करना चाहता हूं, कुंजी नेटवर्क नेटवर्क द्वारा एक बार क्लाइंट और सर्वर मशीन पर लोड की जाती है और बाद में संचार केवल उपयोगकर्ता ही होगा जिसके लिए हमने लोड किया है कुंजी।क्या हम एसएसएच कुंजी-आधारित संचार के लिए जेएसएच का उपयोग कर सकते हैं?

sftp -oPort=10022 [email protected] 

रूप [email protected]

इस आदेश काम ठीक तरह और SFTP, मैं कैसे इस कार्यक्षमता प्रोग्राम के रूप में प्राप्त कर सकते हैं करने के लिए कनेक्ट।

यदि यह जेएसएच का उपयोग करना संभव नहीं है, तो कृपया कुछ अन्य लाइब्रेरी का सुझाव दें। मैं 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

असल में मेरे पास कोई कुंजी नहीं है, यह नेटवर्क टीम द्वारा सिस्टम में पहले से लोड हो चुकी है, और अब मैं कुंजी या पासवर्ड के बिना कमांड का उपयोग कर सर्वर से कनेक्ट कर सकता हूं। –

+1

* सिस्टम में प्रीलोडेड * का अर्थ यह हो सकता है कि यह '.ssh/id_rsa' या इसी तरह है, या आपके मेजबान के लिए' .ssh/config' में एक विशेष सेटिंग है, या आप कुछ प्रोग्राम जैसे 'ssh_agent' का उपयोग कर रहे हैं मांग पर कुंजी दें। अन्वेषण करें कि आपके लिए कौन सा मामला है, और इसे अपने प्रश्न में जोड़ें। –

+0

अच्छा प्रिय यह वास्तव में मेरी मदद की। दिशानिर्देश के लिए धन्यवाद। –

संबंधित मुद्दे