Ganymed SSH2 模拟putty远程交互式执行命令工具

Beaver_ 发布于 2015/08/09 23:37
阅读 1K+
收藏 0

接着上篇http://blog.csdn.net/doctor_who2004/article/details/47322105的介绍:

我们模拟下putty这类交互式的执行远程命令:

  1. import java.io.BufferedReader;  
  2. import java.io.IOException;  
  3. import java.io.InputStreamReader;  
  4. import java.io.PrintWriter;  
  5. import java.nio.charset.StandardCharsets;  
  6. import java.util.Scanner;  
  7. import java.util.concurrent.ExecutorService;  
  8. import java.util.concurrent.Executors;  
  9. import java.util.concurrent.TimeUnit;  
  10.   
  11. import org.apache.commons.io.IOUtils;  
  12. import org.slf4j.Logger;  
  13. import org.slf4j.LoggerFactory;  
  14.   
  15. import ch.ethz.ssh2.Connection;  
  16. import ch.ethz.ssh2.Session;  
  17. import ch.ethz.ssh2.StreamGobbler;  
  18.   
  19. /** 
  20.  * 模拟交互式终端 
  21.  *  
  22.  * @author doctor 
  23.  * 
  24.  * @time 2015年8月6日   
  25.  * 
  26.  * @see http://www.programcreek.com/java-api-examples/index.php?api=ch.ethz.ssh2.SCPClient 
  27.  * 
  28.  */  
  29. public final class SSHAgent2 {  
  30.     private Logger log = LoggerFactory.getLogger(getClass());  
  31.     private Connection connection;  
  32.     private Session session;  
  33.     private BufferedReader stdout;  
  34.     private PrintWriter printWriter;  
  35.     private BufferedReader stderr;  
  36.     private ExecutorService service = Executors.newFixedThreadPool(3);  
  37.     private Scanner scanner = new Scanner(System.in);  
  38.   
  39.     public void initSession(String hostName, String userName, String passwd) throws IOException {  
  40.         connection = new Connection(hostName);  
  41.         connection.connect();  
  42.   
  43.         boolean authenticateWithPassword = connection.authenticateWithPassword(userName, passwd);  
  44.         if (!authenticateWithPassword) {  
  45.             throw new RuntimeException("Authentication failed. Please check hostName, userName and passwd");  
  46.         }  
  47.         session = connection.openSession();  
  48.         session.requestDumbPTY();  
  49.         session.startShell();  
  50.         stdout = new BufferedReader(new InputStreamReader(new StreamGobbler(session.getStdout()), StandardCharsets.UTF_8));  
  51.         stderr = new BufferedReader(new InputStreamReader(new StreamGobbler(session.getStderr()), StandardCharsets.UTF_8));  
  52.         printWriter = new PrintWriter(session.getStdin());  
  53.     }  
  54.   
  55.     public void execCommand() throws IOException {  
  56.         service.submit(new Runnable() {  
  57.   
  58.             @Override  
  59.             public void run() {  
  60.                 String line;  
  61.                 try {  
  62.                     while ((line = stdout.readLine()) != null) {  
  63.                         System.out.println(line);  
  64.                     }  
  65.                 } catch (IOException e) {  
  66.                     e.printStackTrace();  
  67.                 }  
  68.   
  69.             }  
  70.         });  
  71.   
  72.         service.submit(new Runnable() {  
  73.   
  74.             @Override  
  75.             public void run() {  
  76.                 while (true) {  
  77.                     try {  
  78.                         TimeUnit.SECONDS.sleep(1);  
  79.                     } catch (InterruptedException e) {  
  80.   
  81.                         e.printStackTrace();  
  82.                     }  
  83.                     System.out.print("input:");  
  84.                     String nextLine = scanner.nextLine();  
  85.                     printWriter.write(nextLine + "\r\n");  
  86.                     printWriter.flush();  
  87.                 }  
  88.   
  89.             }  
  90.         });  
  91.   
  92.     }  
  93.   
  94.     public void close() {  
  95.         IOUtils.closeQuietly(stdout);  
  96.         IOUtils.closeQuietly(stderr);  
  97.         IOUtils.closeQuietly(printWriter);  
  98.         IOUtils.closeQuietly(scanner);  
  99.         session.close();  
  100.         connection.close();  
  101.     }  
  102.   
  103.     /** 
  104.      * @param args 
  105.      * @throws IOException 
  106.      */  
  107.     public static void main(String[] args) throws IOException {  
  108.         SSHAgent2 sshAgent = new SSHAgent2();  
  109.         sshAgent.initSession("127.0.0.1""doctor""xxxx");  
  110.   
  111.         sshAgent.execCommand();  
  112.   
  113.         // sshAgent.close();  
  114.   
  115.     }  
  116.   
  117. }  

这里读写流我分别在不同线程下操作,防止读写流之间的阻塞,简单模拟交互环境。当然,登陆的是本地系统,没有安装虚拟机等。


执行结果:

  1. Last login: Thu Aug  6 20:18:52 2015 from 127.0.0.1  
  2.   
  3. input:pwd;  
  4. [doctor@localhost ~]$ pwd;  
  5. /home/doctor  
  6. [doctor@localhost ~]$   
  7. input:ll  
  8. [doctor@localhost ~]$ ll  
  9. 总用量 2013760  
  10. drwxrwxr-x.  3 doctor doctor      4096 7月  27 21:58 android-sdk_r24.3.3-linux  
  11. -rw-rw-r--.  1 doctor doctor 309109716 7月  26 17:05 android-sdk_r24.3.3-linux.tgz  
  12. drwxrwxr-x.  7 doctor doctor      4096 7月  29 00:04 android-studio  
  13. -rw-rw-r--.  1 doctor doctor 258628239 7月  26 17:01 android-studio-ide-141.1980579-linux.zip  
  14. drwxrwxr-x.  3 doctor doctor      4096 7月   5 09:48 app  
  15. drwxrwxr-x.  7 doctor doctor      4096 8月   4 22:11 Documents  
  16. drwxrwxr-x. 21 doctor doctor      4096 8月   2 21:22 git  
  17. drwxrwxr-x.  3 doctor doctor      4096 6月  14 12:03 ideaIU-14.1.3  
  18. -rw-rw-r--.  1 doctor doctor 308609842 6月  13 13:36 ideaIU-14.1.3.tar.gz  
  19. drwxrwxr-x. 11 doctor doctor      4096 7月  26 12:26 jstorm-0.9.6.3  
  20. -rw-rw-r--.  1 doctor doctor  11113536 6月   8 21:19 jstorm-0.9.6.3.zip  
  21. drwxrwxr-x.  7 doctor doctor      4096 7月  23 21:24 node_modules  
  22. -rw-rw-r--.  1 doctor doctor  20063992 7月  11 11:49 node-v0.12.7.tar.gz  
  23. drwxrwxrwx. 18 doctor doctor      4096 8月   2 18:10 opt  
  24. -rw-rw-r--.  1 doctor doctor    466053 7月  28 20:05 pljava-x86_64-unknown-linux-gnu-pg9.1-1.4.3.tar.gz  
  25. -rwxrwxrwx.  1 doctor doctor    155693 7月  24 21:58 plv8-1.4.4.tar.gz  
  26. drwxrwxr-x.  3 doctor doctor      4096 7月  27 23:33 pycharm-professional-4.5.3  
  27. -rwxrwxrwx.  1 doctor doctor 160688951 7月  27 22:38 pycharm-professional-4.5.3.tar.gz  
  28. drwxrwxr-x.  3 doctor doctor      4096 7月  27 23:35 PycharmProjects  
  29. drwxrwxr-x.  3 doctor doctor      4096 6月   9 19:08 spring-tool-suite-3.6.4.RELEASE-e4.4.2-linux-gtk-x86_64  
  30. -rwxrwxrwx.  1 doctor doctor 417016357 6月   8 22:13 spring-tool-suite-3.6.4.RELEASE-e4.4.2-linux-gtk-x86_64.tar.gz  
  31. drwxrwxr-x.  3 doctor doctor      4096 7月   3 21:14 spring-tool-suite-3.7.0.RELEASE-e4.5-linux-gtk-x86_641  
  32. -rwxrwxrwx.  1 doctor doctor 429456394 7月   3 13:20 spring-tool-suite-3.7.0.RELEASE-e4.5-linux-gtk-x86_641.tar.gz  
  33. drwxrwxr-x.  8 doctor doctor      4096 7月  23 22:08 tmp  
  34. drwxrwxr-x. 10 doctor doctor      4096 11月 12 2014 v8-3.31.1  
  35. -rw-rw-r--.  1 doctor doctor  16423158 7月  25 00:28 v8-3.31.1.tar.gz  
  36. drwxrwxr-x.  3 doctor doctor      4096 6月   8 20:49 WebStorm-10.0.3  
  37. -rw-rw-r--.  1 doctor doctor 130207806 6月   8 20:04 WebStorm-10.0.3.tar.gz  
  38. drwxrwxr-x.  5 doctor doctor      4096 7月  29 19:51 WebstormProjects  
  39. drwxrwxr-x.  5 doctor doctor      4096 9月  25 2014 zookeeper  
  40. drwxrwxr-x.  3 doctor doctor      4096 8月  13 2014 壁纸  
  41. drwxr-xr-x.  2 doctor doctor      4096 7月  26 17:00 图片  
  42. drwxr-xr-x.  2 doctor doctor      4096 7月  30 23:34 文档  
  43. drwxr-xr-x.  2 doctor doctor      4096 8月   5 21:47 下载  
  44. drwxr-xr-x.  2 doctor doctor      4096 6月   7 21:44 桌面  
  45. [doctor@localhost ~]$   
  46. input:who  
  47. [doctor@localhost ~]$ who  
  48. doctor   pts/1        2015-08-06 20:28 (127.0.0.1)  
  49. [doctor@localhost ~]$   
  50. input:who am i  
  51. [doctor@localhost ~]$ who am i  
  52. doctor   pts/1        2015-08-06 20:28 (127.0.0.1)  
  53. [doctor@localhost ~]$   
  54. input:date  
  55. [doctor@localhost ~]$ date  
  56. 2015年 08月 06日 星期四 20:29:18 CST  
  57. [doctor@localhost ~]$   
  58. input:  



版权声明:本文为博主原创文章,未经博主允许不得转载[http://blog.csdn.net/doctor_who2004]。


来源ME csdn:http://blog.csdn.net/doctor_who2004/article/details/47322577

加载中
返回顶部
顶部