這裏主要是由於咱們報表平臺有用到用戶手工錄入的數據做爲結果數據且須要歸入saiku去展現java
如咱們所知,saiku不會自動刷新,因此須要在數據更新接口中調用服務器上的shell腳本linux
話很少說,上代碼: (直接使用Eclipse, run Java Application ,執行成功後腳本中的輸出內容會打印到控制檯)shell
package saikuDemo1; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; import java.io.*; /** * 遠程執行linux的shell script * @author Ickes * @author2 hpp * @since V0.2 */ public class RemoteExecuteCommand { //字符編碼默認是utf-8 private static String DEFAULTCHART="UTF-8"; private static Connection conn; private String ip; private String userName; private String userPwd; public RemoteExecuteCommand(String ip, String userName, String userPwd) { this.ip = ip; this.userName = userName; this.userPwd = userPwd; } public RemoteExecuteCommand() { } /** * 遠程登陸linux的主機 * @author Ickes * @since V0.1 * @return * 登陸成功返回true,不然返回false */ public Boolean login(){ boolean flg=false; try { conn = new Connection(ip); conn.connect();//鏈接 flg=conn.authenticateWithPassword(userName, userPwd);//認證 if (flg){ System.out.println("認證成功!"); } } catch (IOException e) { e.printStackTrace(); } return flg; } /** * @author Ickes * 遠程執行shll腳本或者命令 * @param cmd * 即將執行的命令 * @return * 命令執行完後返回的結果值 * @since V0.1 */ public String execute(String cmd){ String result=""; try { if(login()){ Session session= conn.openSession();//打開一個會話 session.execCommand(cmd);//執行命令 result=processStdout(session.getStdout(),DEFAULTCHART); //若是爲獲得標準輸出爲空,說明腳本執行出錯了 if(result == null){ result=processStdout(session.getStderr(),DEFAULTCHART); } conn.close(); session.close(); } } catch (IOException e) { e.printStackTrace(); } return result; } /** * @author Ickes * 遠程執行shll腳本或者命令 * @param cmd * 即將執行的命令 * @return * 命令執行成功後返回的結果值,若是命令執行失敗,返回空字符串,不是null * @since V0.1 */ public String executeSuccess(String cmd){ String result=""; try { if(login()){ Session session= conn.openSession();//打開一個會話 session.execCommand(cmd);//執行命令 result=processStdout(session.getStdout(),DEFAULTCHART); conn.close(); session.close(); } } catch (IOException e) { e.printStackTrace(); } return result; } /** * 解析腳本執行返回的結果集 * @author Ickes * @param in 輸入流對象 * @param charset 編碼 * @since V0.1 * @return * 以純文本的格式返回 */ public static String processStdout(InputStream in, String charset){ InputStream stdout = new StreamGobbler(in); StringBuffer buffer = new StringBuffer();; try { BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset)); String line=null; while((line=br.readLine()) != null){ buffer.append(line+"\n"); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return buffer.toString(); } public static void main(String[] args) { RemoteExecuteCommand rec=new RemoteExecuteCommand("10.22.33.44", "root","root");// 參數分別爲服務器IP ,用戶名,密碼 //執行命令 try { if(rec.login()){ System.out.println("=====第一個步驟====="); Session session= conn.openSession();//打開一個會話 //TODO:多條命令 session.execCommand("sh /app/Saiku/saikuRefreshShell.sh");//執行命令,這裏須要肯定刷新腳本存在的絕對路徑哦 String result=processStdout(session.getStdout(),DEFAULTCHART); //若是爲獲得標準輸出爲空,說明腳本執行出錯了 if(result == null){ System.out.println("腳本出錯"); result=processStdout(session.getStderr(),DEFAULTCHART); } System.out.println(result); session.close(); /** System.out.println("=====第二個步驟====="); Session session2= conn.openSession();//打開一個會話 //TODO:多條命令 session2.execCommand("cd /home/ubuntu/Desktop/music_rec/user_sim/result;cat xyy_result_m10d.json");//執行命令 String result2=processStdout(session2.getStdout(),DEFAULTCHART); //若是爲獲得標準輸出爲空,說明腳本執行出錯了 if(result == null ){//StringUtils.isBlank(result2) System.out.println("腳本出錯"); result2=processStdout(session2.getStderr(),DEFAULTCHART); } System.out.println(result2); session2.close(); */ conn.close(); } } catch (IOException e) { e.printStackTrace(); } } public static void setCharset(String charset) { DEFAULTCHART = charset; } public Connection getConn() { return conn; } public void setConn(Connection conn) { this.conn = conn; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPwd() { return userPwd; } public void setUserPwd(String userPwd) { this.userPwd = userPwd; } }