使用纯java ssh方式连接linux服务器,并用此方式部署war到linux的tomcat下

标签: java ssh linux | 发表时间:2016-05-31 04:02 | 作者:探索者_技术
出处:http://www.iteye.com
纯java代码使用ssh方式登录linux服务。
实际应用中,可以使用这种方式上传部署web工程war包 并且部署启动tomcat 一个自动化完成所有工作 起到节省时间作用。

1.去 官网下载最新的jar包
jsch-0.1.51.jar


下面是我的java code 例子


/**
 * java ssh登录linux以后的一些操作方式
 * @author liuxy
 *
 */
public class SchUnitJsch extends SchUnit{
    private final static Log logger =LogFactory.getLog(SchUnitJsch.class);
 public SchUnitJsch() {
 super();
 }



 public SchUnitJsch(String username, String password, String host) {
 super(username, password, host);
 }
 /**
 * 开启session
 * @return
 * @throws JSchException
 */
 private  Session openSession() throws JSchException{
    JSch jsch=new JSch();
 Session session=null;    
 session=jsch.getSession(username, host);
     Properties sshConfig = new Properties();  
    sshConfig.put("StrictHostKeyChecking", "no");  
    session.setConfig(sshConfig); 
    session.setPassword(password);
    session.connect(3000);
 return session;
 }
 /**
 * 上传本地文件到远程linux上
 * 使用sftp上传
 */
 @Override
 public boolean uploadLocalFileToRemote(String localFile, String remoteDir) {
   Session session=null;
 try {
 session = openSession();
 } catch (JSchException e) {
 logger.error(e.getMessage());
 if(session!=null) session.disconnect();
 return false;
 }
 ChannelSftp channel=null;
 try {
 channel=(ChannelSftp) session.openChannel("sftp");
 channel.connect();
 SftpProgressMonitorImpl sftpProgressMonitorImpl=new SftpProgressMonitorImpl();
 channel.put(localFile, remoteDir,sftpProgressMonitorImpl);
 
 return sftpProgressMonitorImpl.isSuccess();
 }catch (JSchException e) {
 if(channel!=null){
 channel.disconnect();
             session.disconnect();
 }
    return  false;
 } catch (SftpException e) {
 logger.error(e.getMessage());
 }
 return false;
 }
 /**
 * 上传镜像映射检测
 * @author liuxy
 *
 */
   static class  SftpProgressMonitorImpl implements SftpProgressMonitor{
 private  long size;
 private  long currentSize=0;
 private  boolean endFlag=false;
 @Override
 public void init(int op, String srcFile, String dstDir, long size) {
 logger.debug("文件开始上传:【"+srcFile+"】-->【"+dstDir+"】"+",文件大小:"+size+",参数"+op);
 this.size=size; 
 }
 
 @Override
 public void end() {
 logger.debug("文件上传结束");
 endFlag=true;
 }
 
 @Override
 public boolean count(long count){
 currentSize+=count;
 logger.debug("上传数量:"+currentSize); 
 return true;
 }
 public boolean isSuccess(){
 return endFlag&&currentSize==size;
 }
 }
 
 /**
 * 执行指令
 * @param commands
 */
 public StringBuffer executeCommands(String commands){
 return executeCmd(commands).getOutRes();
 }
 /**
 * 执行shell指令并且返回结果对象ResInfo
 * @param commands
 * @return
 */
 public ResInfo executeCmd(String commands){
     ResInfo resInfo=new ResInfo();
     Session session=null;
 try {
 session = openSession();
 } catch (JSchException e) {
 logger.debug(e.getMessage());
 if(session!=null) session.disconnect();
 return null;
 }
 ChannelExec channel=null;
 StringBuffer result=new StringBuffer();
 StringBuffer errResult=new StringBuffer();
 try {
     channel=(ChannelExec) session.openChannel("exec");
     channel.setCommand(commands);
     channel.setInputStream(null);
       ((ChannelExec)channel).setErrStream(null);
       InputStream in=channel.getInputStream();
       InputStream err=channel.getErrStream();
       channel.connect();
       byte[] bytes=new byte[1024];
       byte[] bytesErr=new byte[1024];
       while(true){
       while(in.available()>0){
       int i=in.read(bytes, 0, 1024);
       if(i0){
       int i=err.read(bytesErr, 0, 1024);
       if(i0||err.available()>0) continue;
       logger.debug("exit-status: "+channel.getExitStatus());
       resInfo.setExitStuts(channel.getExitStatus());
       resInfo.setOutRes(result);
       resInfo.setErrRes(errResult);
               break;
       }
       Thread.sleep(1000);
       }
     return resInfo;
 } catch (JSchException e) {
 logger.error(e.getMessage());
     return null;
 } catch (Exception e) {
 logger.error(e.getMessage());
 return null;
 }finally{
 channel.disconnect();
 session.disconnect();
 }
 } 
 
 //exec command 结果返回对象
     public static class ResInfo{
   int exitStuts;//返回状态码 (在linux中可以通过 echo $? 可知每步执行令执行的状态码)
    StringBuffer outRes;//标准正确输出流内容
    StringBuffer errRes;//标准错误输出流内容
    public int getExitStuts() {
     return exitStuts;
     }
 public void setExitStuts(int exitStuts) {
 this.exitStuts = exitStuts;
 }
 public StringBuffer getOutRes() {
 return outRes;
 }
 public void setOutRes(StringBuffer outRes) {
 this.outRes = outRes;
 }
 public StringBuffer getErrRes() {
 return errRes;
 }
 public void setErrRes(StringBuffer errRes) {
 this.errRes = errRes;
 }
   
 public void clear(){
 exitStuts=0;
 outRes=errRes=null;
 }
 }
 
 
 
 public static abstract class MyUserInfo
     implements UserInfo, UIKeyboardInteractive{
 @Override
 public String getPassword(){ return null; }
 @Override
 public boolean promptYesNo(String str){ return false; }
 @Override
 public String getPassphrase(){ return null; }
 @Override
 public boolean promptPassphrase(String message){ return false; }
 @Override
 public boolean promptPassword(String message){ return false; }
 @Override
 public void showMessage(String message){ }
 @Override
 public String[] promptKeyboardInteractive(String destination,
 String name, String instruction, String[] prompt, boolean[] echo) {
 return null;
 }
 } 
    /**
     * 删除远程linux下的文件
     */
 @Override
 public boolean deleteRemoteFileorDir(String remoteFile) {
   Session session=null;
 try {
 session = openSession();
 } catch (JSchException e) {
 logger.info(e.getMessage());
 if(session!=null) session.disconnect();
 return false;
 }
 ChannelSftp channel=null;
 try {
 channel=(ChannelSftp) session.openChannel("sftp");
 channel.connect();
 SftpATTRS sftpATTRS= channel.lstat(remoteFile);
 if(sftpATTRS.isDir()){
 //目录
 logger.debug("remote File:dir");
 channel.rmdir(remoteFile);
 return true;
 }else if(sftpATTRS.isReg()){
 //文件
 logger.debug("remote File:file");
 channel.rm(remoteFile);
 return true;
 }else{
 logger.debug("remote File:unkown");
 return false;
 }
 }catch (JSchException e) {
 if(channel!=null){
 channel.disconnect();
             session.disconnect();
 }
    return  false;
 } catch (SftpException e) {
 logger.error(e.getMessage());
 }
 return false;
 }
    /**
     * 判断linux下 某文件是否存在
     */
 @Override
 public boolean detectedFileExist(String remoteFile) {
   Session session=null;
 try {
 session = openSession();
 } catch (JSchException e) {
 logger.info(e.getMessage());
 if(session!=null) session.disconnect();
 return false;
 }
 ChannelSftp channel=null;
 try {
 channel=(ChannelSftp) session.openChannel("sftp");
 channel.connect();
 SftpATTRS sftpATTRS= channel.lstat(remoteFile);
 if(sftpATTRS.isDir()||sftpATTRS.isReg()){
 //目录 和文件
 logger.info("remote File:dir");
 return true;
 }else{
 logger.info("remote File:unkown");
 return false;
 }
 }catch (JSchException e) {
 if(channel!=null){
 channel.disconnect();
             session.disconnect();
 }
    return  false;
 } catch (SftpException e) {
 logger.error(e.getMessage());
 }
 return false;
 }


}



将web工程的war部署到tomcat下的


/**
 * 将war包部署到linux的tomcat下一些操作方法
 * @author liuxy
 *
 */
public class DetectedTomcatService extends BaseService{
	private final static Log logger=LogFactory.getLog(DetectedTomcatService.class);
    //tomcat所在的linux下的根目录
	public String baseTomcatHome;
	public DetectedTomcatService(String username, String pwd, String host) {
		super(username, pwd, host);
	}
	/**
	 * 检测tomcat是否启动
	 */
	public  boolean isStartingTomcat(String command){
	  if(command==null)command="ps -ef | grep Tomcat | grep -v grep"; 
	  StringBuffer res=sshUnit.executeCommands(command);
	  logger.debug(res);
	  return !StringUtils.isBlank(res);
	  
	}
	/**
	 * 关闭tomcat
	 */
	public  boolean  shutdownTomcat(String commandShutdownTomcat){
		
		String command="ps -ef | grep Tomcat | grep -v grep";
	    if(isStartingTomcat(command)){
	    	if(StringUtils.isBlank(commandShutdownTomcat)){
	    	   	StringBuffer res=sshUnit.executeCommands(command);
		        String[] fragments=res.toString().split("\\s+");
		        for(String fragment:fragments){
		        	logger.debug(fragment);
		        	if(fragment.indexOf("catalina.base")>-1||fragment.indexOf("catalina.base")>-1)
		        	{
		        		baseTomcatHome=fragment.split("=")[1];
		        		break;
		        	}
		        	continue;
		        }
		         logger.info("baseTomcatHome:"+baseTomcatHome);
		         if(baseTomcatHome!=null) commandShutdownTomcat="sh  "+baseTomcatHome+"/bin/shutdown.sh";
			}
            //关闭tomcat
      		sshUnit.executeCommands(commandShutdownTomcat);
				//等待几秒钟
			   try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				 logger.equals(e.getMessage());
			}
			   boolean  success=isStartingTomcat(command);
			    if(success){
			     	StringBuffer res=sshUnit.executeCommands(command);
			        String[] fragments=res.toString().split("\\s+");
			    	sshUnit.executeCommands("kill -9 "+fragments[1]);
			    }
	    	return true;
	    }
		return true;
	}
	/**
	 * 开启tomcat
	 */
	public void startupTomcat(String commandStartupTomcat){
		String command="ps -ef | grep Tomcat | grep -v grep";
	    if(isStartingTomcat(command)){
	    	shutdownTomcat(null);
	    }
	    //开启tomcat
	    if(StringUtils.isBlank(commandStartupTomcat))
	    	commandStartupTomcat="sh "+baseTomcatHome+"/bin/startup.sh";
	    sshUnit.executeCommands(commandStartupTomcat);
	}
	/**
	 * 删除war包
	 * @return
	 */
	public boolean deleteWar(){
		String regex=baseTomcatHome+"/webapps/ROOT*";
		String deleteCommand="rm -rf "+ regex;
		String  detectFileCommand="ls "+baseTomcatHome+"/webapps | grep ROOT";
		String commands=deleteCommand+" ; "+detectFileCommand;
		StringBuffer res=sshUnit.executeCommands(commands);
		return StringUtils.isBlank(res);
	}
	/**
	 * 上传war包
	 * @param baseTomcatHome
	 */
	public boolean uploadWar(String localFile){
		String remoteDir=baseTomcatHome+"/webapps";
		sshUnit.uploadLocalFileToRemote(localFile,remoteDir);
		return sshUnit.uploadLocalFileToRemote(localFile,remoteDir);
	}
	
	public boolean warDealwith(){
	   String commands="cd "+baseTomcatHome+"/webapps;mv ROOT.war ROOT.zip;unzip ROOT.zip -d ROOT;rm -rf ROOT.zip";
	   StringBuffer res=sshUnit.executeCommands(commands);
	   logger.info(res);
	   return !StringUtils.isBlank(res);
	}
	
	
	public void setBaseTomcatHome(String baseTomcatHome) {
		this.baseTomcatHome = baseTomcatHome;
	}
	

}


测试war包上传例子
/**
 * 将演示主程序
 * @author liuxy
 *
 */
public class TomcatPublish{
	private static final Log logger =LogFactory.getLog(TomcatPublish.class);
    private DetectedTomcatService tomcatService;
    private String baseTomcatHome="/opt/server/Tomcat";//设置默认tomcat根目录
    private String localFileWarPath;//本地war包路径
    public  TomcatPublish(String username,String pwd,String host){
    	tomcatService=new DetectedTomcatService(username, pwd, host);
    	tomcatService.setBaseTomcatHome(baseTomcatHome);
    }
    public  void publish(){
    	//关闭tomcat 
    	boolean success=tomcatService.shutdownTomcat(null);
    	
    	if(!success){
    		logger.debug("Tomcat shutdown failed"); return ;
    	}
    	//删除原有文件
        success=tomcatService.deleteWar();
        if(!success){
        	logger.debug("ROOT 残留war包已经文件没有删除干净");
        	return  ;
        }
    		//上传文件
 	    if(tomcatService.uploadWar(localFileWarPath)){
 	    	//解压
 	        logger.debug("=============================================解压缩====================");
 	        if(tomcatService.warDealwith()){
 	       	logger.debug("........start Tomcat......");
 	    	tomcatService.startupTomcat(null);
 	    	try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
				   
			}
 	    	System.exit(0);
 	        }
 	    
 	    }
 	    else
 	    	logger.debug("上传失败war");
   
    }
	public DetectedTomcatService getTomcatService() {
		return tomcatService;
	}
	public void setTomcatService(DetectedTomcatService tomcatService) {
		this.tomcatService = tomcatService;
	}
	public String getBaseTomcatHome() {
		return baseTomcatHome;
	}
	public void setBaseTomcatHome(String baseTomcatHome) {
		this.baseTomcatHome = baseTomcatHome;
	}
	public String getLocalFileWarPath() {
		return localFileWarPath;
	}
	public void setLocalFileWarPath(String localFileWarPath) {
		this.localFileWarPath = localFileWarPath;
	}
    public static void main(String[] args) {
     TomcatPublish tomcatPublish=new TomcatPublish("登录用户名(如root)","密码","主机域名(如:192.168.0.123)");
     tomcatPublish.setLocalFileWarPath("E:\\WarFiles\\ROOT.war");	
    	TomcatPublish tomcatPublish=new 	tomcatPublish.publish();	
	}
}





已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java ssh linux] 推荐:

linux配置ssh+rsync

- - CSDN博客推荐文章
sftp    文件共享 类似ftp  ssh  secure file transfer client. scp    文件共享 类似cp. #PermitRootLogin yes    改成no 禁止root直接登录. #Port 22    改变ssh的默认端口号   要打开注释. 登录  ssh  gwyy@192.168.111.130  然后输入密码就好了.

使用纯java ssh方式连接linux服务器,并用此方式部署war到linux的tomcat下

- - Linux - 操作系统 - ITeye博客
纯java代码使用ssh方式登录linux服务. 实际应用中,可以使用这种方式上传部署web工程war包 并且部署启动tomcat 一个自动化完成所有工作 起到节省时间作用. 1.去 官网下载最新的jar包. 下面是我的java code 例子. /** * java ssh登录linux以后的一些操作方式 * @author liuxy * */ public class SchUnitJsch extends SchUnit{.

Linux SSH帐号权限限制

- Jona - 细节的力量
来源:http://feedproxy.google.com/~r/JoysBoy/~3/TdH16qMVTJk/. 在天朝用SSH来Proxy是家常便饭了,别跟我说你不知道怎么用. 我自己也经常在vps上开一些ssh帐号给朋友用,一般都把shell设置为nologin,这样来禁止他们登入服务器. 不过有一点很麻烦,密码只能由我设,当然也只能设个简单的,朋友不可能把自己平常用的密码随便告诉我,改密码也只能由我操作.

批量自动建立linux服务器之间的ssh互信

- - Linux - 操作系统 - ITeye博客
介绍:我们在部署无密码访问时,如果手工输入.很费时间.下面方法用于自动化生成authorized_keys,免去了手工数据. 方法: 利用expect编写sshkey.exp在远程主机上生成id_rsa,并重定向到本地.在利用noscp.exp.把文件复制到远程主机. 步骤:(本方法在centos6.4 上验证通过).

Linux下修改ssh端口和禁止root远程登录

- - 记录开发点点滴滴
1、编辑/etc/ssh/ssh_config文件:. 将被注释掉的Port 22前的注释符号“#”去掉,并将22改为8888,保存退出. 2、编辑/etc/ssh/sshd_config文件:. 将Port 22改为8888,并找到PermitRootLogin,将后面的yes改为no,这样root就不能远程登录了,保存退出.

無用 – 更改Linux SSH登入歡迎畫面為新世紀福音戰士裡的Nerv的logo

- CMGS - 程式設計 遇上 小提琴
不要問我這有什麼用,只是純好玩,如果你的ssh沒有用utf8編碼的話可能會看到亂碼,以下是看起來的效果. 做法很簡單,修改/etc/motd檔即可,如果你想要這個Nerv logo,可以下載這個motd.txt然後解開後覆蓋原本的motd即可. Logo作者為ptt的cfi697,而原始版本因為字型寬度的問題我修正了一下.

python/java操作linux系统命令

- 天朝小民 - ITeye论坛最新讨论
看来python的确是做为脚本语言来使用的话,非常的方便. 来看一个处理linux命令的脚本. #coding:utf-8 import os import commands ''' 采用os.popen(cmd)来执行命令,要获取输出,需要read()来读取 ''' cmd = 'ls -l' values = os.popen(cmd).read() #print values for v in values.split('\n'):.

JAVA ,SSH中文及其乱码问题的解决 6大配置点 使用UTF-8编码

- - CSDN博客编程语言推荐文章
JSP,mysql,tomcat下(基于struts2)中文及其乱码问题的解决 6大配置点 使用UTF-8编码. 目前对遇到J2EE 开发中 中文及其乱码问题,参考网上资料做个总结, 主要是6大配置点:. 1 struts2配置 2 数据库 3 页面 4 jdbc连接 5 tomcat 6.hibernate配置.

SSH Tunnel扫盲

- Jerry - 老王的技术手册 ( 我的新博客:http://huoding.com )
前些天,由于我不知道如何在Putty里拷贝字符而被朋友们取笑,着实糗了一把. 不过被别人B4的一大好处就是你会知耻而后勇,这阵子通过研读PuTTY 中文教程,估计以后不会再犯同样的错误了,在学习Putty的同时偶然发现自己对SSH Tunnel的了解很匮乏,所以便有了今天这篇笔记. SSH Tunnel有三种,分别是本地Local(ssh -NfL),远程Remote(ssh -NfR),动态Dynamic(ssh -NfD).

SSH那些事儿

- Mao.. - Visual Mao++
不知道读者中知道SSH有多少,我想除了pro们,剩下的都是用VPS. 一般来说,用SSH就是用ssh –D[1]这个动态转发接口,至于做什么用也就不明说了,大家都懂. 熟悉hg的都知道可以从“ssh://”地址克隆repository[2],那剩下的呢. 故事的起因是office desktop在department firewall之内,用laptop的remote desktop(RDP)连接office需要先用PuTTY之类的神器连接department firewall(OpenBSD的哦),然后再用RDP连接desktop[3].