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(); } } }

浙公网安备 33010602011771号