Jsch 深入浅出

2024-03-13 12:08
文章标签 深入浅出 jsch

本文主要是介绍Jsch 深入浅出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://xliangwu.iteye.com/blog/1499764



如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉。ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接。ssh 在连接和传送的过程中会加密所有的数据。具体的解释,大家可以参考百度百科的文档。地址为:http://baike.baidu.com/view/16184.htm

但是SSH一般是基于客户端的或者Linux命令行的。比如客户端的工具:OpenSSH,putty,SSH Tectia;在linux上大家可以通过ssh username@host连接到所要想连接的主机。但是如果在J2EE中,如何实现SSH呢?进而可以实现SCP,SFTP的功能呢?下面介绍的JSCH就可以实现下边的功能。

JSCH是一个纯粹的用java实现SSH功能的java  library. 官方地址为:http://www.jcraft.com/jsch/

GitHub 地址为:https://github.com/vngx/vngx-jsch

mvn 配置如下:

<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.46</version></dependency>

 

下面简单介绍下JSCH的特点:

1.基于DSA和RSA加密。

2.可以实现4中认证机制。分别是:

(1i): password

(2i): publickey(DSA,RSA)

(3i): keyboard-interactive

(4i): gss-api-with-mic

3.生成public/private key pair.

4.执行bash script 等脚本

5.可以通过HTTP/SOCK5 proxy

6.支持常见SSH1协议和SSH2协议

我们日常用到的JSCH主要是基于是密码认证和private key 认证。

基于密码认证的比较简单。简单代码如下:

 

 

Java代码   收藏代码
  1. public class JschHandler {  
  2.     private static final Logger log = LoggerFactory.getLogger(JschHandler.class);  
  3.       
  4.     public static final String SFTP_PROTOCAL = "sftp";  
  5.     private String username;  
  6.     private String host;  
  7.     private int port;  
  8.     private String identity;  
  9.     private UserInfo userInfo;  
  10.       
  11.     private JSch jsch = null;  
  12.     protected Session session = null;  
  13.     private boolean firstInit = false;  
  14.     private int authType = -1;  
  15.       
  16.     /** 
  17.      * Private/public key authorization 
  18.      * @param username user account 
  19.      * @param host  server host 
  20.      * @param port  ssh port 
  21.      * @param identity the path of private key file. 
  22.      * @see http://www.jcraft.com/jsch/ 
  23.      */  
  24.     public JschHandler(String username,String host,int port,String identity){  
  25.         this.username = username;  
  26.         this.host = host;  
  27.         this.port = port;  
  28.         this.identity = identity;  
  29.           
  30.         firstInit = false;  
  31.         jsch = new JSch();  
  32.           
  33.         authType = 0 ;  
  34.     }  
  35.       
  36.     /** 
  37.      * Password authorization 
  38.      * @param username 
  39.      * @param host 
  40.      * @param port 
  41.      * @param userInfo User information for authorization 
  42.      * @see com.jcraft.jsch.UserInfo 
  43.      * @see http://www.jcraft.com/jsch/ 
  44.      */  
  45.     public JschHandler(String username,String host,int port,UserInfo userInfo){  
  46.         this.username = username;  
  47.         this.host = host;  
  48.         this.port = port;  
  49.         this.userInfo = userInfo;  
  50.           
  51.         firstInit = false;  
  52.         jsch = new JSch();  
  53.         authType = 1;  
  54.     }  
  55.     /** 
  56.      *  
  57.      * Initialize SSH session. 
  58.      * When the parameters is not right, It will throw an JSchException. 
  59.      * @throws MessageServicerException 
  60.      * @see com.jcraft.jsch.JSch 
  61.      */  
  62.     @SuppressWarnings("static-access")  
  63.     protected void init() throws JSchException{  
  64.         try {  
  65.             validate();  
  66.             log.info("JSCH identity:"+identity);  
  67.             jsch.setLogger(new JschLogger());  
  68.             jsch.setConfig("StrictHostKeyChecking""no");  
  69.               
  70.             if(authType==0) jsch.addIdentity(identity);  
  71.             session = jsch.getSession(username, host, port);  
  72.               
  73.             if(authType==1) session.setUserInfo(userInfo);  
  74.             session.connect();  
  75.               
  76.             log.info("JSCH session connect success.");  
  77.         } catch (JSchException e) {  
  78.             log.error(e.getMessage());  
  79.             throw e;  
  80.         }  
  81.     }  
  82.       
  83.     /** 
  84.      * Validate parameters 
  85.      * @throws JSchException 
  86.      */  
  87.     private void validate() throws JSchException{  
  88.         if(firstInit) return;  
  89.         if(username==null||username.isEmpty()){  
  90.             throw new JSchException("Parameter:username is empty.");  
  91.         }  
  92.         if(host==null||host.isEmpty()){  
  93.             throw new JSchException("Parameter:host is empty.");  
  94.         }else{  
  95.             try {  
  96.                 InetAddress inet = InetAddress.getByName(host);  
  97.                 host = inet.getHostAddress();  
  98.                 log.info("JSCH connection address:"+host);  
  99.             } catch (UnknownHostException e) {  
  100.                 throw new JSchException(e.getMessage(),e);  
  101.             }  
  102.         }  
  103.           
  104.         if(authType==0&&(identity==null||identity.isEmpty())){  
  105.             throw new JSchException("Parameter:identity is empty.");  
  106.         }  
  107.           
  108.         if(authType==1&&(userInfo==null)){  
  109.             throw new JSchException("Parameter:userInfo is empty.");  
  110.         }  
  111.           
  112.         firstInit = true;  
  113.     }  
  114.       
  115.     /** 
  116.      * release connections. 
  117.      * @author  
  118.      */  
  119.     protected void destory(){  
  120.         if(session!=null) session.disconnect();  
  121.         log.info("JSCH session destory");  
  122.     }  
  123.     private static class JschLogger implements com.jcraft.jsch.Logger{  
  124.   
  125.         @Override  
  126.         public boolean isEnabled(int level) {  
  127.             return true;  
  128.         }  
  129.   
  130.         @Override  
  131.         public void log(int level, String message) {  
  132.             System.out.println(String.format("[JSCH --> %s]", message));  
  133.         }  
  134.     }  
  135.       
  136.     public void setUserInfo(UserInfo userInfo) {  
  137.         this.userInfo = userInfo;  
  138.     }  
  139. }  

    client

 

Java代码   收藏代码
  1. public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {  
  2.         public String getPassword() {  
  3.             return null;  
  4.         }  
  5.   
  6.         public boolean promptYesNo(String str) {  
  7.             Object[] options = { "yes""no" };  
  8.             int foo = JOptionPane.showOptionDialog(null, str, "Warning",  
  9.                     JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,  
  10.                     null, options, options[0]);  
  11.             return foo == 0;  
  12.         }  
  13.   
  14.         String passphrase;  
  15.         JTextField passphraseField = (JTextField) new JPasswordField(20);  
  16.   
  17.         public String getPassphrase() {  
  18.             return passphrase;  
  19.         }  
  20.   
  21.         public boolean promptPassphrase(String message) {  
  22.             Object[] ob = { passphraseField };  
  23.             int result = JOptionPane.showConfirmDialog(null, ob, message,  
  24.                     JOptionPane.OK_CANCEL_OPTION);  
  25.             if (result == JOptionPane.OK_OPTION) {  
  26.                 passphrase = passphraseField.getText();  
  27.                 return true;  
  28.             } else {  
  29.                 return false;  
  30.             }  
  31.         }  
  32.   
  33.         public boolean promptPassword(String message) {  
  34.             return true;  
  35.         }  
  36.   
  37.         public void showMessage(String message) {  
  38.             JOptionPane.showMessageDialog(null, message);  
  39.         }  
  40.   
  41.         final GridBagConstraints gbc = new GridBagConstraints(001111,  
  42.                 GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,  
  43.                 new Insets(0000), 00);  
  44.         private Container panel;  
  45.   
  46.         public String[] promptKeyboardInteractive(String destination,  
  47.                 String name, String instruction, String[] prompt, boolean[] echo) {  
  48.             panel = new JPanel();  
  49.             panel.setLayout(new GridBagLayout());  
  50.   
  51.             gbc.weightx = 1.0;  
  52.             gbc.gridwidth = GridBagConstraints.REMAINDER;  
  53.             gbc.gridx = 0;  
  54.             panel.add(new JLabel(instruction), gbc);  
  55.             gbc.gridy++;  
  56.   
  57.             gbc.gridwidth = GridBagConstraints.RELATIVE;  
  58.   
  59.             JTextField[] texts = new JTextField[prompt.length];  
  60.             for (int i = 0; i < prompt.length; i++) {  
  61.                 gbc.fill = GridBagConstraints.NONE;  
  62.                 gbc.gridx = 0;  
  63.                 gbc.weightx = 1;  
  64.                 panel.add(new JLabel(prompt[i]), gbc);  
  65.   
  66.                 gbc.gridx = 1;  
  67.                 gbc.fill = GridBagConstraints.HORIZONTAL;  
  68.                 gbc.weighty = 1;  
  69.                 if (echo[i]) {  
  70.                     texts[i] = new JTextField(20);  
  71.                 } else {  
  72.                     texts[i] = new JPasswordField(20);  
  73.                 }  
  74.                 panel.add(texts[i], gbc);  
  75.                 gbc.gridy++;  
  76.             }  
  77.   
  78.             if (JOptionPane.showConfirmDialog(null, panel, destination + ": "  
  79.                     + name, JOptionPane.OK_CANCEL_OPTION,  
  80.                     JOptionPane.QUESTION_MESSAGE) == JOptionPane.OK_OPTION) {  
  81.                 String[] response = new String[prompt.length];  
  82.                 for (int i = 0; i < prompt.length; i++) {  
  83.                     response[i] = texts[i].getText();  
  84.                 }  
  85.                 return response;  
  86.             } else {  
  87.                 return null// cancel  
  88.             }  
  89.         }  
  90.     }  

 @Test

Java代码   收藏代码
  1. public void testSftp() throws JSchException{  
  2.     UserInfo userInfo = new MyUserInfo();  
  3.     JftpHandler jhandler = new JftpHandler("username","hostname",22,userInfo);  
  4.     try {  
  5.         jhandler.init();  
  6.     } catch (Exception e) {  
  7.         // TODO Auto-generated catch block  
  8.         e.printStackTrace();  
  9.     }  
  10.     String pwd = null;  
  11.     try {  
  12.         pwd = jhandler.pwd();  
  13.     } catch (SftpException e) {  
  14.         // TODO Auto-generated catch block  
  15.         e.printStackTrace();  
  16.     }  
  17.     System.out.println(pwd);  
  18. /       jhandler.destory();  
  19. }  
 

基于private key 认证的有点费时。关于如何配置private/public key认证,大家通过google来配置。简单流程如下:

1.在linux 下执行ssh-keygen -t dsa /ssh-keygen -t rsa.这样就会成一对对应的public key 和private key.比如id_dsa_1024,id_dsa_1024.pub.

2. 把public key(id_dsa_1024.pub)复制到想要连接的服务器上,放到对应用户的.ssh目录下。

3.

cd ~/.ssh

#将Client的公钥放入Server的信任列表

cat id_dsa_1024.pub >> authorized_keys

#更新权限,很重要

chmod 0600 *从此以后Client SSH登录Server就不要手工输入密码了

配置完成以后,重新登录一下,就可以发现不用输入密码就可以实现远程登录了。

由于现在基于SSH协议的算法很多,加密和解密的算法也不一样。目前Jsch只支持OpenSSH和SSH 1生成的private/public key.

所以当你们发现不能通过private/public key认证的时候,不是jsch的问题,而是不能识别的问题。

简单代码如下:

 

 

 

Java代码   收藏代码
  1. @Test  
  2.     public void testSftp() throws JSchException{  
  3.         JftpHandler jhandler = new JftpHandler("username","hostname",22,"C:\\data\\id_dsa_2048_a");  
  4.         try {  
  5.             jhandler.init();  
  6.         } catch (Exception e) {  
  7.             // TODO Auto-generated catch block  
  8.             e.printStackTrace();  
  9.         }  
  10.         String pwd = null;  
  11.         try {  
  12.             pwd = jhandler.pwd();  
  13.         } catch (SftpException e) {  
  14.             // TODO Auto-generated catch block  
  15.             e.printStackTrace();  
  16.         }  
  17.         System.out.println(pwd);  
  18. //      jhandler.destory();  
  19.     }  

如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉。ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接。ssh 在连接和传送的过程中会加密所有的数据。具体的解释,大家可以参考百度百科的文档。地址为:http://baike.baidu.com/view/16184.htm

但是SSH一般是基于客户端的或者Linux命令行的。比如客户端的工具:OpenSSH,putty,SSH Tectia;在linux上大家可以通过ssh username@host连接到所要想连接的主机。但是如果在J2EE中,如何实现SSH呢?进而可以实现SCP,SFTP的功能呢?下面介绍的JSCH就可以实现下边的功能。

JSCH是一个纯粹的用java实现SSH功能的java  library. 官方地址为:http://www.jcraft.com/jsch/

GitHub 地址为:https://github.com/vngx/vngx-jsch

mvn 配置如下:

<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.46</version></dependency>

 

下面简单介绍下JSCH的特点:

1.基于DSA和RSA加密。

2.可以实现4中认证机制。分别是:

(1i): password

(2i): publickey(DSA,RSA)

(3i): keyboard-interactive

(4i): gss-api-with-mic

3.生成public/private key pair.

4.执行bash script 等脚本

5.可以通过HTTP/SOCK5 proxy

6.支持常见SSH1协议和SSH2协议

我们日常用到的JSCH主要是基于是密码认证和private key 认证。

基于密码认证的比较简单。简单代码如下:

 

 

Java代码   收藏代码
  1. public class JschHandler {  
  2.     private static final Logger log = LoggerFactory.getLogger(JschHandler.class);  
  3.       
  4.     public static final String SFTP_PROTOCAL = "sftp";  
  5.     private String username;  
  6.     private String host;  
  7.     private int port;  
  8.     private String identity;  
  9.     private UserInfo userInfo;  
  10.       
  11.     private JSch jsch = null;  
  12.     protected Session session = null;  
  13.     private boolean firstInit = false;  
  14.     private int authType = -1;  
  15.       
  16.     /** 
  17.      * Private/public key authorization 
  18.      * @param username user account 
  19.      * @param host  server host 
  20.      * @param port  ssh port 
  21.      * @param identity the path of private key file. 
  22.      * @see http://www.jcraft.com/jsch/ 
  23.      */  
  24.     public JschHandler(String username,String host,int port,String identity){  
  25.         this.username = username;  
  26.         this.host = host;  
  27.         this.port = port;  
  28.         this.identity = identity;  
  29.           
  30.         firstInit = false;  
  31.         jsch = new JSch();  
  32.           
  33.         authType = 0 ;  
  34.     }  
  35.       
  36.     /** 
  37.      * Password authorization 
  38.      * @param username 
  39.      * @param host 
  40.      * @param port 
  41.      * @param userInfo User information for authorization 
  42.      * @see com.jcraft.jsch.UserInfo 
  43.      * @see http://www.jcraft.com/jsch/ 
  44.      */  
  45.     public JschHandler(String username,String host,int port,UserInfo userInfo){  
  46.         this.username = username;  
  47.         this.host = host;  
  48.         this.port = port;  
  49.         this.userInfo = userInfo;  
  50.           
  51.         firstInit = false;  
  52.         jsch = new JSch();  
  53.         authType = 1;  
  54.     }  
  55.     /** 
  56.      *  
  57.      * Initialize SSH session. 
  58.      * When the parameters is not right, It will throw an JSchException. 
  59.      * @throws MessageServicerException 
  60.      * @see com.jcraft.jsch.JSch 
  61.      */  
  62.     @SuppressWarnings("static-access")  
  63.     protected void init() throws JSchException{  
  64.         try {  
  65.             validate();  
  66.             log.info("JSCH identity:"+identity);  
  67.             jsch.setLogger(new JschLogger());  
  68.             jsch.setConfig("StrictHostKeyChecking""no");  
  69.               
  70.             if(authType==0) jsch.addIdentity(identity);  
  71.             session = jsch.getSession(username, host, port);  
  72.               
  73.             if(authType==1) session.setUserInfo(userInfo);  
  74.             session.connect();  
  75.               
  76.             log.info("JSCH session connect success.");  
  77.         } catch (JSchException e) {  
  78.             log.error(e.getMessage());  
  79.             throw e;  
  80.         }  
  81.     }  
  82.       
  83.     /** 
  84.      * Validate parameters 
  85.      * @throws JSchException 
  86.      */  
  87.     private void validate() throws JSchException{  
  88.         if(firstInit) return;  
  89.         if(username==null||username.isEmpty()){  
  90.             throw new JSchException("Parameter:username is empty.");  
  91.         }  
  92.         if(host==null||host.isEmpty()){  
  93.             throw new JSchException("Parameter:host is empty.");  
  94.         }else{  
  95.             try {  
  96.                 InetAddress inet = InetAddress.getByName(host);  
  97.                 host = inet.getHostAddress();  
  98.                 log.info("JSCH connection address:"+host);  
  99.             } catch (UnknownHostException e) {  
  100.                 throw new JSchException(e.getMessage(),e);  
  101.             }  
  102.         }  
  103.           
  104.         if(authType==0&&(identity==null||identity.isEmpty())){  
  105.             throw new JSchException("Parameter:identity is empty.");  
  106.         }  
  107.           
  108.         if(authType==1&&(userInfo==null)){  
  109.             throw new JSchException("Parameter:userInfo is empty.");  
  110.         }  
  111.           
  112.         firstInit = true;  
  113.     }  
  114.       
  115.     /** 
  116.      * release connections. 
  117.      * @author  
  118.      */  
  119.     protected void destory(){  
  120.         if(session!=null) session.disconnect();  
  121.         log.info("JSCH session destory");  
  122.     }  
  123.     private static class JschLogger implements com.jcraft.jsch.Logger{  
  124.   
  125.         @Override  
  126.         public boolean isEnabled(int level) {  
  127.             return true;  
  128.         }  
  129.   
  130.         @Override  
  131.         public void log(int level, String message) {  
  132.             System.out.println(String.format("[JSCH --> %s]", message));  
  133.         }  
  134.     }  
  135.       
  136.     public void setUserInfo(UserInfo userInfo) {  
  137.         this.userInfo = userInfo;  
  138.     }  
  139. }  

    client

 

Java代码   收藏代码
  1. public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {  
  2.         public String getPassword() {  
  3.             return null;  
  4.         }  
  5.   
  6.         public boolean promptYesNo(String str) {  
  7.             Object[] options = { "yes""no" };  
  8.             int foo = JOptionPane.showOptionDialog(null, str, "Warning",  
  9.                     JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,  
  10.                     null, options, options[0]);  
  11.             return foo == 0;  
  12.         }  
  13.   
  14.         String passphrase;  
  15.         JTextField passphraseField = (JTextField) new JPasswordField(20);  
  16.   
  17.         public String getPassphrase() {  
  18.             return passphrase;  
  19.         }  
  20.   
  21.         public boolean promptPassphrase(String message) {  
  22.             Object[] ob = { passphraseField };  
  23.             int result = JOptionPane.showConfirmDialog(null, ob, message,  
  24.                     JOptionPane.OK_CANCEL_OPTION);  
  25.             if (result == JOptionPane.OK_OPTION) {  
  26.                 passphrase = passphraseField.getText();  
  27.                 return true;  
  28.             } else {  
  29.                 return false;  
  30.             }  
  31.         }  
  32.   
  33.         public boolean promptPassword(String message) {  
  34.             return true;  
  35.         }  
  36.   
  37.         public void showMessage(String message) {  
  38.             JOptionPane.showMessageDialog(null, message);  
  39.         }  
  40.   
  41.         final GridBagConstraints gbc = new GridBagConstraints(001111,  
  42.                 GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,  
  43.                 new Insets(0000), 00);  
  44.         private Container panel;  
  45.   
  46.         public String[] promptKeyboardInteractive(String destination,  
  47.                 String name, String instruction, String[] prompt, boolean[] echo) {  
  48.             panel = new JPanel();  
  49.             panel.setLayout(new GridBagLayout());  
  50.   
  51.             gbc.weightx = 1.0;  
  52.             gbc.gridwidth = GridBagConstraints.REMAINDER;  
  53.             gbc.gridx = 0;  
  54.             panel.add(new JLabel(instruction), gbc);  
  55.             gbc.gridy++;  
  56.   
  57.             gbc.gridwidth = GridBagConstraints.RELATIVE;  
  58.   
  59.             JTextField[] texts = new JTextField[prompt.length];  
  60.             for (int i = 0; i < prompt.length; i++) {  
  61.                 gbc.fill = GridBagConstraints.NONE;  
  62.                 gbc.gridx = 0;  
  63.                 gbc.weightx = 1;  
  64.                 panel.add(new JLabel(prompt[i]), gbc);  
  65.   
  66.                 gbc.gridx = 1;  
  67.                 gbc.fill = GridBagConstraints.HORIZONTAL;  
  68.                 gbc.weighty = 1;  
  69.                 if (echo[i]) {  
  70.                     texts[i] = new JTextField(20);  
  71.                 } else {  
  72.                     texts[i] = new JPasswordField(20);  
  73.                 }  
  74.                 panel.add(texts[i], gbc);  
  75.                 gbc.gridy++;  
  76.             }  
  77.   
  78.             if (JOptionPane.showConfirmDialog(null, panel, destination + ": "  
  79.                     + name, JOptionPane.OK_CANCEL_OPTION,  
  80.                     JOptionPane.QUESTION_MESSAGE) == JOptionPane.OK_OPTION) {  
  81.                 String[] response = new String[prompt.length];  
  82.                 for (int i = 0; i < prompt.length; i++) {  
  83.                     response[i] = texts[i].getText();  
  84.                 }  
  85.                 return response;  
  86.             } else {  
  87.                 return null// cancel  
  88.             }  
  89.         }  
  90.     }  

 @Test

Java代码   收藏代码
  1. public void testSftp() throws JSchException{  
  2.     UserInfo userInfo = new MyUserInfo();  
  3.     JftpHandler jhandler = new JftpHandler("username","hostname",22,userInfo);  
  4.     try {  
  5.         jhandler.init();  
  6.     } catch (Exception e) {  
  7.         // TODO Auto-generated catch block  
  8.         e.printStackTrace();  
  9.     }  
  10.     String pwd = null;  
  11.     try {  
  12.         pwd = jhandler.pwd();  
  13.     } catch (SftpException e) {  
  14.         // TODO Auto-generated catch block  
  15.         e.printStackTrace();  
  16.     }  
  17.     System.out.println(pwd);  
  18. /       jhandler.destory();  
  19. }  
 

基于private key 认证的有点费时。关于如何配置private/public key认证,大家通过google来配置。简单流程如下:

1.在linux 下执行ssh-keygen -t dsa /ssh-keygen -t rsa.这样就会成一对对应的public key 和private key.比如id_dsa_1024,id_dsa_1024.pub.

2. 把public key(id_dsa_1024.pub)复制到想要连接的服务器上,放到对应用户的.ssh目录下。

3.

cd ~/.ssh

#将Client的公钥放入Server的信任列表

cat id_dsa_1024.pub >> authorized_keys

#更新权限,很重要

chmod 0600 *从此以后Client SSH登录Server就不要手工输入密码了

配置完成以后,重新登录一下,就可以发现不用输入密码就可以实现远程登录了。

由于现在基于SSH协议的算法很多,加密和解密的算法也不一样。目前Jsch只支持OpenSSH和SSH 1生成的private/public key.

所以当你们发现不能通过private/public key认证的时候,不是jsch的问题,而是不能识别的问题。

简单代码如下:

 

 

 

Java代码   收藏代码
  1. @Test  
  2.     public void testSftp() throws JSchException{  
  3.         JftpHandler jhandler = new JftpHandler("username","hostname",22,"C:\\data\\id_dsa_2048_a");  
  4.         try {  
  5.             jhandler.init();  
  6.         } catch (Exception e) {  
  7.             // TODO Auto-generated catch block  
  8.             e.printStackTrace();  
  9.         }  
  10.         String pwd = null;  
  11.         try {  
  12.             pwd = jhandler.pwd();  
  13.         } catch (SftpException e) {  
  14.             // TODO Auto-generated catch block  
  15.             e.printStackTrace();  
  16.         }  
  17.         System.out.println(pwd);  
  18. //      jhandler.destory();  
  19.     }  

这篇关于Jsch 深入浅出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/804828

相关文章

深入浅出SRS—RTMP实现

RTMP 直播是 SRS 最典型的使用场景,客户端使用 RTMP 协议向 SRS 推流,使用 RTMP 协议从 SRS 拉流,SRS 作为一个 RTMP 直播服务器实现媒体的转发。同时,RTMP 是 SRS 的中转协议,其他协议之间的互通需要先转为 RTMP,因此,理解 SRS RTMP 直播实现是理解其他协议实现的重要前提。本文主要分析 SRS RTMP 直播功能的实现原理,相关概念和配置请参考

深入浅出Java垃圾回收机制

对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用。   这仅仅代表我个人的意见,但我坚信一个精通GC的人往往是一个好的Java开发者。如果你对GC的处理过程感兴趣,说明你已经具备较大规模应用的开发经验。如果你曾经想过如何正确的选择GC算法,那意味着你已经完全理解你所开发的应用的特点

深入浅出Stream流

Java 8的新特性之一就是流stream,配合同版本出现的 Lambda ,使得操作集合(Collection)提供了极大的便利。 案例引入 在JAVA中,涉及到对数组、Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。 假设遇到了这么一个需求:从给定句子中返回单词长度大于5的单词列表,按长度倒序输出,最多返回3个。

深入浅出Android中的MVP模式

MVP模式是在MVC模式的基础之上改进而来的。MVP模式分为:model,view,presenter三部分。三部分的关系如下图所示: 其中PresenterCompl实现IPresenter接口,PresenterCompl中的方法要改变view时通过调用IView中的方法来实现。Model层为PresenterCompl提供数据。 也就是说之前MVC中view的控制都是在activit

[Cocoa]深入浅出 Cocoa 之 Core Data(2)- 手动编写代码

深入浅出 Cocoa 之 Core Data(2)- 代码示例 罗朝辉( http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 前面 详细讲解了 Core Data 的框架以及设计的类,下面我们来讲解一个完全手动编写代码使用这些类的示例,这个例子来自苹果官方示例。在这个例子里面,我们打算做这样一件事情:记录程序运行记录(时间与 proc

带你深入浅出之QT编程:一、掌握信号与槽的奥秘

此为QT编程的第一谈!关注我,带你快速学习QT编程的学习路线! 每一篇的技术点都是很很重要!很重要!很重要!但不冗余! 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点! 码农不易,各位学者学到东西请点赞支持支持! 开始部分: 总:信号与槽,简单来说:信号就是事件,槽就是函数。信号只需声明,不需要实现,槽函数需要实现。(重中之中,开发过程中贯穿此机制) 就像我去咖啡厅点餐(

深入浅出:关系数据库中的基础概念与形式化定义

关系数据库是现代数据管理系统的核心,而理解关系数据库的基础概念是学习和应用这一技术的第一步。在这篇文章中,我们将通过简洁明了的解释,帮助您掌握关系的形式化定义及其相关概念。 1. 什么是关系模型? 关系模型是数据库管理系统中用于组织和管理数据的一种模型。它以二维表的形式表示数据,表中的每一行代表一个实体或记录,而每一列则代表一个属性或字段。 1.1 关系模型的基础 在关系模型中,数据的组织

【vSphere 7/8】深入浅出 vSphere 证书 Ⅲ—— vSphere 证书的更新和替换概述

目录 摘要1. vSphere Certificate Architecture2. 证书更新和替换概述2.1更新 VMCA 签名的证书(1)使用 vSphere Client UI(2)使用 vSphere Certificate Manager 命令行工具(自动)(3)使用 dir-cli、certool 和 vecs-cli 命令行工具(手动)(4)使用 vSphere Automat

O'Reilly之深入浅出Head First系列的中文版与英文版合集

来源url:http://blog.csdn.net/torchfire/article/details/12320479 Head First系列是O’Reilly出版社最成功的系列图书,自问世以来受到了无数读者的喜爱,并屡获大奖。其图文并茂,讲述编程技术由浅到深,也被称为“深入浅出”系列,是不可多得的各阶段程序员的参考学习资料。 收藏的中文版:  深入浅出数据分析(美

带你深入浅出新面经:十六、十大排序之快速排序

此为面经第十六谈!关注我,每日带你深入浅出一个新面经。 我们要了解面经要如何“说”! 很重要!很重要!很重要! 我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的) 码农不易,各位学者学到东西请点赞支持支持! 排序算法部分可以记忆简单过程概述。 开始部分: 总:快速排序算法通过选取一个基准值,将数组分为两个子数组,一个包含小于基准值的元