Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2396084
  • 博文数量: 328
  • 博客积分: 4302
  • 博客等级: 上校
  • 技术积分: 5486
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 11:14
个人简介

悲剧,绝对的悲剧,悲剧中的悲剧。

文章分类

全部博文(328)

文章存档

2017年(6)

2016年(18)

2015年(28)

2014年(73)

2013年(62)

2012年(58)

2011年(55)

2010年(28)

分类: Java

2015-06-26 15:15:49


SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议。SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接。SSH提供两种的安全验证方式:基于密码的认证和基于密匙的认证。其中,基于密码的认证比较简单,只要知道远程主机的用户名和密码,就可以进行登录。基于密匙的认证比较麻烦,而且连接比较耗时,这里不详细介绍。有很多基于SSH协议的客户端,例如:PuTTY、OpenSSH、Xshell 4等,可以远程连接几乎所有UNIX平台。同时,可以通过Linux命令行ssh uername@host连接到某主机。

在项目中,如何利用代码实现SSH,远程执行Shell脚本呢?JSch是Java Secure Channel的缩写,是一个SSH2功能的纯Java实现,具体信息可以参考JSch官网。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,同时你也可以集成它的功能到你自己的应用程序。在使用前,需要下载并导入JSch包:jsch-0.1.50.jar。

实例代码如下,同时可以参考官网的例子以及其他的例子
  1. # cat Exec.java
  2. import com.jcraft.jsch.*;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. import java.io.*;

  6. public class Exec{
  7.   public static void main(String[] arg){
  8.     try{
  9.       JSch jsch=new JSch();

  10.       System.out.print("host:user:password are " + arg[0] + arg[1] + arg[2]);

  11.       String host=arg[0];
  12.       String user=arg[1];

  13.       Session session=jsch.getSession(user, host, 22);

  14.       session.setPassword(arg[2]);
  15.       session.setConfig("StrictHostKeyChecking", "no");
  16.       session.connect(60 * 1000);

  17.       String command=arg[3];

  18.       Channel channel=session.openChannel("exec");
  19.       ((ChannelExec)channel).setCommand(command);

  20.       channel.setInputStream(null);

  21.       ((ChannelExec)channel).setErrStream(System.err);

  22.       InputStream in=channel.getInputStream();

  23.       channel.connect();

  24.       byte[] tmp=new byte[1024];
  25.       while(true){
  26.         while(in.available()>0){
  27.           int i=in.read(tmp, 0, 1024);
  28.           if(i<0)break;
  29.           System.out.print(new String(tmp, 0, i));
  30.         }
  31.         if(channel.isClosed()){
  32.           if(in.available()>0) continue;
  33.           System.out.println("exit-status: "+channel.getExitStatus());
  34.           break;
  35.         }
  36.         try{Thread.sleep(1000);}catch(Exception ee){}
  37.       }
  38.       channel.disconnect();
  39.       session.disconnect();
  40.     }
  41.     catch(Exception e){
  42.       System.out.println(e);
  43.     }
  44.   }

  45. }

运行结果:
  1. [root@aie-cntest2-110 tmp]# CLASSPATH=/tmp/jsch.jar:. javac Exec.java

  2. [root@aie-cntest2-110 tmp]# CLASSPATH=/tmp/jsch.jar:. java Exec localhost root password "ls -la /"
  3. host:user:password are localhostrootrootroottotal 194
  4. drwxr-xr-x 26 root root 4096 Apr 28 10:04 .
  5. drwxr-xr-x 26 root root 4096 Apr 28 10:04 ..
  6. drwxr-xr-x 2 root root 4096 May 8 2013 bin
  7. drwxr-xr-x 4 root root 1024 Oct 29 2012 boot
  8. drwxr-xr-x 12 root root 4300 Apr 28 10:05 dev

另一种模拟shell的方式:
  1. private ArrayList<String> runcommand(String command) {
  2.                 File tmpfile = new File(System.getProperty("java.io.tmpdir")+"_cli_output_.log");
  3.             tmpfile.deleteOnExit();
  4.                 ArrayList<String> results = new ArrayList<String>();

  5.                 try {
  6.                     JSch jsch = new JSch();
  7.                     Session session = jsch.getSession(USER, HOST, PORT);
  8.                     session.setPassword(PASSWORD);
  9.                     session.setConfig("StrictHostKeyChecking", "no");
  10.                     session.connect(60 * 1000);

  11.                     Channel channel=session.openChannel("shell");
  12.                     channel.setInputStream(new ByteArrayInputStream(command.getBytes()));
  13.                     channel.setOutputStream(new FileOutputStream(tmpfile));
  14.                     channel.connect();

  15.                     Thread.sleep(10000);
  16.                     channel.disconnect();
  17.                     session.disconnect();

  18.                         Scanner readtmpfile = new Scanner(tmpfile);
  19.                 try {
  20.                     String rtnline;
  21.                     while(readtmpfile.hasNext()) {
  22.                         rtnline = readtmpfile.nextLine();
  23.                         results.add(rtnline);
  24.                         System.out.println(rtnline);
  25.                     }
  26.                 } catch (Exception e) {
  27.                     e.printStackTrace();
  28.                 }

  29.                 return results;
  30.         }

阅读(5510) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~