1. 程式人生 > >Java執行linux命令及shell指令碼

Java執行linux命令及shell指令碼

import java.io.*;
import java.util.*;

import org.apache.log4j.Logger;

import com.jcraft.jsch.*;

public class SshServerUtils {
		
	private static final Logger log = Logger.getLogger(SshServerUtils.class);
	
	private static Session session;
	
	//連線伺服器
    private static void connect(String username, String passwd, String host, int port) {
        try {
            JSch jsch = new JSch();
            //獲取sshSession
            session = jsch.getSession(username, host, port);
            //新增密碼
            session.setPassword(passwd);
            Properties sshConfig = new Properties();
            //嚴格主機金鑰檢查
            sshConfig.put("StrictHostKeyChecking", "no");
            session.setConfig(sshConfig);
            //開啟sshSession連線
            session.connect();
            log.info("Server connection successful.");
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }
    
    //執行相關命令
    public static String execCmd(String command, String username, String passwd, String host, int port, String outFilePath) {
 
        String resultJson = null;
        ChannelExec channelExec = null;
        if (command != null) {
            try {
                connect(username, passwd, host, port);
                channelExec = (ChannelExec) session.openChannel("exec");
                // 設定需要執行的shell命令
                channelExec.setCommand(command);
                log.info("linux命令:" + command);
                channelExec.setInputStream(null);
                channelExec.setErrStream(System.err);
                channelExec.connect();
                //讀資料
                resultJson = getServerData(host, port, username, passwd, outFilePath);
            } catch (JSchException e) {
                e.printStackTrace();
            } finally {
                if (null != channelExec) {
                    channelExec.disconnect();
                }
            }
        }
        return resultJson;
    }
 
    // 從 伺服器 獲取 資料
    private static String getServerData(String host, int port, String username,String password, String filePath) {
        ChannelSftp sftp = null;
        StringBuffer buffer = new StringBuffer();
        try {
            if (!session.isConnected()) {
                connect(username, password, host, port);
            }
            //獲取sftp通道
            Channel channel = session.openChannel("sftp");
            //開啟
            channel.connect();
            sftp = (ChannelSftp) channel;
            log.info("Connected to " + host + ".");
            //獲取生成檔案流
            InputStream inputStream = sftp.get(filePath);
            BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
            String line = "";
            while ((line = in.readLine()) != null) {
                buffer.append(line);
            }
            //關閉流
            inputStream.close();
            in.close();
            log.info(" 執行結果為: " + buffer.toString());
 
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSchException e) {
            e.printStackTrace();
        } catch (SftpException e) {
            e.printStackTrace();
        } finally {
            if (null != sftp) {
                sftp.quit();
            }
            closeSession();
        }
        return buffer.toString();
    }
 
 
    public static void closeSession() {
        if (session != null) {
            session.disconnect();
        }
    }
 
    public static String getUUID() {
        UUID uuid = UUID.randomUUID();
        String str = uuid.toString();
        return str.replace("-", "");
    }
}