1 導入pom
<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency>
2 編寫配置類
package com.budwk.app.atest;import com.budwk.app.common.config.AppException;
import com.jcraft.jsch.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.IOUtils;
import org.nutz.ioc.loader.annotation.IocBean;import java.io.*;
import java.util.ArrayList;
import java.util.List;@Config
@Slf4j
public class JSchSessionComponent {private static final String ip = "172.168.1.1";private static final int port = 22;private static final String userName = "root";private static final String password = "123456";/*** jsch創建連接* @return*/public Session getJSchSession(){JSch jSch = new JSch();Session session = null;try {//創建連接session = jSch.getSession(userName,ip,port);session.setPassword(password);//是否使用密鑰登錄,一般默認為nosession.setConfig("StrictHostKeyChecking", "no");boolean connected = session.isConnected();if (connected) {return session;}//啟用連接session.connect(15222200);log.info("服務器連接成功");return session;}catch (Exception e){log.error("服務器連接失敗", e);throw new AppException("服務器連接失敗");}}//jsch關閉連接public void closeJSchSession(Session session){log.info("關閉連接開始");if (session != null) {session.disconnect();log.info("關閉連接結束");}}public boolean uploadFile(Session sshSession, File file) {log.info("文件正在上傳中,請等待......");boolean isSuccess = false;InputStream is = null;try {Channel channel = sshSession.openChannel("sftp");channel.connect();ChannelSftp sftp = (ChannelSftp) channel;sftp.cd("/data/www/wk-mini/");//上傳時接文件的服務器的存放目錄String fileName =file.getName();is = new FileInputStream(file);sftp.put(is, fileName, ChannelSftp.OVERWRITE);//有重名文件覆蓋log.info("文件上傳結束");isSuccess = true;} catch (Exception e) {log.error("linux upload File error:", e);throw new AppException("文件上傳失敗");} finally {IOUtils.closeQuietly(is);}return isSuccess;}public List<String> executeShell(Session session , List<String> commands){log.info("項目開始啟動,請等待");//用來存放命令的返回值List<String> cmdResult = new ArrayList<>();for (String command : commands) {Channel channel = null;try {//創建執行通道channel = session.openChannel("exec");//設置命令((ChannelExec) channel).setCommand(command);//連接通道channel.connect();//讀取通道的輸出InputStream in = channel.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(in));//存放命令的執行結果,如果結果有很多行,則每次line的值不同String line;//lines用來拼接line結果StringBuffer lines = new StringBuffer();while ((line = reader.readLine()) != null) {//去除頭尾的空格line.trim();lines = lines.append(line);}//如果命令執行沒有返回值,則直接輸出沒有返回值if (String.valueOf(lines).equals("")){cmdResult.add("命令["+command+"]執行成功,但沒有返回值");}else {//否則將每行返回直接存入到list中cmdResult.add(String.valueOf(lines));}reader.close();channel.disconnect();} catch (Exception e) {log.error("啟動失敗", e);throw new AppException("啟動失敗");}}log.info("項目啟動已結束..................");return cmdResult;}
}
3 測試
package com.budwk.app.atest;import com.jcraft.jsch.*;
import org.nutz.ioc.loader.annotation.IocBean;import java.io.*;
import java.util.ArrayList;
import java.util.List;@IocBean
public class TestDemo {public static void main(String[] args) {// 1 先建立連接JSchSessionComponent jSchSessionComponent = new JSchSessionComponent();Session session = jSchSessionComponent.getJSchSession();File file = new File("E:\\target\\111.jar");
// File file = new File("E:\\target\\1.txt");boolean b = jSchSessionComponent.uploadFile(session, file);if (b) {System.out.println("文件上傳成功");}jSchSessionComponent.closeJSchSession(session);// TestDemo t = new TestDemo();
// t.executeSheel();}private void executeSheel() {JSchSessionComponent jSchSessionComponent = new JSchSessionComponent();Session session = jSchSessionComponent.getJSchSession();// 執行命令List<String> cmds = new ArrayList<>();cmds.add("cd /data/www/;chmod u+x start.sh;./start.sh");jSchSessionComponent.executeShell(session, cmds);}//用來執行命令//Session表示傳遞連接對話,commands表示傳遞命令集合}
4 start.sh文件內容體
# sh ./monitorstart.sh
# sh ./jobstart.sh#!/bin/sh
RESOURCE_NAME=wkProject.jartpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fitpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; thenecho 'App is running.'
elseecho 'App is NOT running.'
firm -f tpid
rm -f wkProject.log
nohup java -jar ./$RESOURCE_NAME >>wkProject.log 2>&1 &
echo $! > tpid
echo Start Success!