JAVA通过SSH方式操作linux

1.导入ganymed-ssh2-build210.jar包

2.定义执行接口

package cn.com.casa.prov.service.session;

import cn.com.casa.prov.domain.CasaSessionManager;

/**
 * @author cz
 *
 */
public interface TaskInterface {
    /**
     * 执行的任务
     * @throws Exception
     */
    void execute()throws Exception;
    /**
     * @return
     */
    boolean addEntity();
     /**
     * @return
     */
    CasaSessionManager getManager() ;
}

 

package pub.util;

/**
 * @author cz
 * Request level dictionary reference
 *
 */
public class CodeUtil {
    public static final String SIMPLE_TYPE="simple";
    public static final String COMPLICATE_TYPE="complicate";
    public static final String COMMAND_TYPE_DHCPCONFIG="dhcp_config";
    public static final String COMMAND_TYPE_CABLECONFIG="cable_config";
}

package pub.util;

import java.util.Properties;

/**
 * @author cz
 *
 */
public class SystemUtil {
    public static String getSystemByLineFeed(){
        Properties prop = System.getProperties();

        String os = prop.getProperty("os.name");
        if(os.toLowerCase().startsWith("win")){
            return "\r\n";
        }
        return "\n";
    }
    
    
    public static final String LINE_FEED=
        System.getProperties().getProperty("os.name").toLowerCase().startsWith("win")?"\r\n":"\n";
    
    public static void main(String[] args) {
        System.out.println(LINE_FEED);
    }
}

 

 

package cn.com.casa.prov.domain;

import pub.util.CodeUtil;

/**
 * @author cz
 *
 */
public class CasaSessionManager {
    private String sessionId;//主键ID使用UUID生成
    private String adminName;//登陆名
    private String modelName;//模块名称
    private String command;//发出的命令
    private String visitorIp;//客户端IP
    private String targetIp;//远程服器的IP;
    private String time;//发命令时的时间
    private String message;//返回的消息
    private String targetUserName;//远程服器的用户名
    private String targetPassword;//远程服器的密码
    private String cfgName;//配置名称
    private String commandType=CodeUtil.SIMPLE_TYPE;//命令类型:simple,complicate
    //模板名称
    private String templateName;
    /**
     * 命令操作类型
     */
    private String comDownType;//有两种:CodeUtil.COMMAND_TYPE_DHCPCONFIG和CodeUtil.COMMAND_TYPE_CABLECONFIG
    
    private String enablePassword;//en密码
    public String getEnablePassword() {
        return enablePassword;
    }
    public void setEnablePassword(String enablePassword) {
        this.enablePassword = enablePassword;
    }
    public String getCommandType() {
        return commandType;
    }
    public void setCommandType(String commandType) {
        this.commandType = commandType;
    }
    public String getSessionId() {
        return sessionId;
    }
    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }
    public String getAdminName() {
        return adminName;
    }
    public void setAdminName(String adminName) {
        this.adminName = adminName;
    }
    public String getModelName() {
        return modelName;
    }
    public void setModelName(String modelName) {
        this.modelName = modelName;
    }
    public String getCommand() {
        return command;
    }
    public void setCommand(String command) {
        this.command = command;
    }
    public String getVisitorIp() {
        return visitorIp;
    }
    public void setVisitorIp(String visitorIp) {
        this.visitorIp = visitorIp;
    }
    public String getTargetIp() {
        return targetIp;
    }
    public void setTargetIp(String targetIp) {
        this.targetIp = targetIp;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public String getTargetUserName() {
        return targetUserName;
    }
    public void setTargetUserName(String targetUserName) {
        this.targetUserName = targetUserName;
    }
    public String getTargetPassword() {
        return targetPassword;
    }
    public void setTargetPassword(String targetPassword) {
        this.targetPassword = targetPassword;
    }
    public String getCfgName() {
        return cfgName;
    }
    public void setCfgName(String cfgName) {
        this.cfgName = cfgName;
    }
    
    public String getComDownType() {
        return comDownType;
    }
    public void setComDownType(String comDownType) {
        this.comDownType = comDownType;
    }
    public String getTemplateName() {
        return templateName;
    }
    public void setTemplateName(String templateName) {
        this.templateName = templateName;
    }
    
}

 

3.初象父类初始化

package cn.com.casa.prov.service.session;

import java.io.IOException;

import org.apache.log4j.Logger;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import cn.com.casa.prov.domain.CasaSessionManager;

/**
 * @author cz
 *
 */
public abstract class BaseTask implements TaskInterface{
    protected Logger logger=Logger.getLogger(this.getClass());
    protected CasaSessionManager manager;
    public BaseTask(CasaSessionManager manager)throws Exception{
        this.manager=manager;
        init();
    }
    
    protected Session session;
    /**
     * 初始化创建连接
     * @throws Exception
     */
    private void init()throws Exception{
        
        logger.info(this.getClass().getName()+" method: init");
        if(manager==null){
            session=null;
        }
        //linux ip地址
         Connection conn=new Connection(manager.getTargetIp());
         conn.connect();
         //linux 用户名和密码
          boolean isAuthenticated = conn.authenticateWithPassword(manager.getTargetUserName(), 
                  manager.getTargetPassword());
            if (isAuthenticated == false){
                throw new IOException("Authentication failed.");
            }
             session=conn.openSession();
    }
    
    
    /* (non-Javadoc)
     * 将完成的任务保存到openldap中
     * @see cn.com.casa.prov.service.session.TaskInterface#addEntity()
     */
    public boolean addEntity(){
        return true;
    }
    /**
     * 关闭session
     * @throws Exception
     */
    public void closeSession()throws Exception{
        try{
            if(session!=null){
                session.close();
            }
        }catch(Exception e){
            logger.error("error",e);
            //throw e;
        }
    }
    public CasaSessionManager getManager() {
        return manager;
    }
    
    
    
    

}

 

4.执行单行命令

package cn.com.casa.prov.service.session.impl;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import pub.util.DateUtil;
import pub.util.StringUtil;
import pub.util.SystemUtil;

import ch.ethz.ssh2.StreamGobbler;
import cn.com.casa.prov.domain.CasaSessionManager;
import cn.com.casa.prov.service.session.BaseTask;

/**
 * 单条命令任务
 * @author cz
 * 
 *
 */
public class SimpleTask extends BaseTask {

    public SimpleTask(CasaSessionManager manager) throws Exception{
        super(manager);
    }

    /* (non-Javadoc)
     * 任务执行体
     * @see cn.com.casa.prov.service.session.TaskInterface#execute()
     */
    @SuppressWarnings("deprecation")
    @Override
    public void execute() throws Exception{
        
        
        
            BufferedReader br=null;
            try{
                if(session==null){
                    throw new Exception("session is null");
                }
            
            session.execCommand(this.getManager().getCommand());
            StringBuffer baseBf=new StringBuffer();
            StringBuffer bf=new StringBuffer();
            
             br = new BufferedReader(new InputStreamReader(new StreamGobbler(session.getStdout())));
             baseBf.append("ServerIp:"+this.getManager().getTargetIp()+SystemUtil.LINE_FEED);
             baseBf.append("time:"+DateUtil.getCurrectByDate());
             while(true){
                 String s=br.readLine();
                 if(s==null){
                     break;
                 }
                 bf.append(s);
             }
             
             if(!StringUtil.checkStr(bf.toString())){
                 baseBf.append("request result is empty!!!"+SystemUtil.LINE_FEED);
             }else{
                 baseBf.append(bf);
             }
             manager.setTime(DateUtil.getCurrectByDate());
             manager.setMessage(baseBf.toString());
             //System.out.println("11111111111111111111111111111111111111111111111");
            }catch(IOException e){
                logger.error("error",e);
                manager.setMessage("ServerIp:"+this.getManager().getTargetIp()+SystemUtil.LINE_FEED+"time:"+DateUtil.getCurrectByDate()+"\ncommand :"+manager.getCommand()+SystemUtil.LINE_FEED+"message:"+e.getLocalizedMessage());
                
            }finally{
                try{
                    if(br!=null){
                        br.close();
                    }
                }catch(Exception e){
                    logger.error("error",e);
                }
                this.closeSession();
            }
    }

}


5.执行多行命令任务

package cn.com.casa.prov.service.session.impl;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import pub.util.DateUtil;
import pub.util.StringUtil;
import pub.util.SystemUtil;

import ch.ethz.ssh2.ChannelCondition;
import ch.ethz.ssh2.StreamGobbler;
import cn.com.casa.prov.domain.CasaSessionManager;
import cn.com.casa.prov.service.session.BaseTask;

/**
 * 多条命令任务
 * @author cz
 *
 */
public class ComplicateTask extends BaseTask{

    /**
     * 构造方法传入CasaSessionManager 对象主要包括目标服务器IP,目标服务器用户名,目标服务器密码
     * 
     * @param manager
     * @throws Exception
     */
    public ComplicateTask(CasaSessionManager manager) throws Exception {
        super(manager);
        
    }

    /* (non-Javadoc)
     * 执行命令
     * @see cn.com.casa.prov.service.session.TaskInterface#execute()
     */
    @SuppressWarnings("deprecation")
    @Override
    public void execute() throws Exception {
        BufferedReader br = null;
        try{
            logger.info("command:"+this.getManager().getCommand());
            session.requestPTY("bash");
            session.startShell();
             br = new BufferedReader(new InputStreamReader(new StreamGobbler(session.getStdout())));
            PrintWriter out =new PrintWriter(session.getStdin());
            out.print(this.getManager().getCommand());
            out.close();
            
            session.waitForCondition(ChannelCondition.CLOSED | ChannelCondition.EOF | ChannelCondition.EXIT_STATUS, 30000);
            StringBuffer baseBf=new StringBuffer();
            baseBf.append("ServerIp:"+this.getManager().getTargetIp()+SystemUtil.LINE_FEED);
            baseBf.append("time:"+DateUtil.getCurrectByDate());
            StringBuffer bf=new StringBuffer("");
            
                while (true)
                {
                    String line = br.readLine();
                    if (line==null)
                    {
                        break;
                    }
                    
                    bf.append(line+SystemUtil.LINE_FEED);
                }
                if(!StringUtil.checkStr(bf.toString())){
                    baseBf.append("request result is empty!!!"+SystemUtil.LINE_FEED);
                }else{
                    baseBf.append(bf.toString().substring(bf.toString().indexOf("Password:")+9));
                }
                manager.setTime(DateUtil.getCurrectByDate());
                manager.setMessage(baseBf.toString());
           logger.info("message:"+bf.toString());
        }catch(Exception e){
            logger.error("error",e);
            manager.setMessage("ServerIp:"+this.getManager().getTargetIp()+SystemUtil.LINE_FEED+"time:"+DateUtil.getCurrectByDate()+"\ncommand :"+manager.getCommand()+SystemUtil.LINE_FEED+"message:"+e.getLocalizedMessage());
        
        
        }finally{
            if(br!=null){
                try {
                    br.close();
                } catch (Exception e) {
                    logger.error("error",e);
                }
            }
            this.closeSession();
        }
        
    }
    
}

 

 

 

posted @ 2013-08-23 09:35  cz_1985  阅读(1758)  评论(1)    收藏  举报