2011-02-08 98 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

相关问题