import com.jcraft.jsch.*; import com.xx.dc.beans.Progress; import com.xx.dc.beans.ProgressMessage; import com.xx.dc.service.SessionManager; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.*; import java.util.Arrays; import java.util.Date; import java.util.List; public class ShellUtils { private static Log log = LogFactory.getLog(ShellUtils.class); public static Session getSession(String user, String passwd, String host) throws JSchException { JSch jsch = new JSch(); Session session = jsch.getSession(user, host, 22); session.setPassword(passwd); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); return session; } /** * 执行相关的命令 * @throws JSchException */ public static void execCmd(String command, String user, String passwd, String host, final String processID) throws JSchException { execCmd(command, user, passwd, host, processID, null); } public static void execCmd(Session session, String command, final String processID, PrintStream ps) throws JSchException { StringBuilder ret = new StringBuilder(); BufferedReader reader = null; Channel channel = null; try { channel = session.openChannel("exec"); ((ChannelExec) channel).setCommand(command); channel.setInputStream(null); ((ChannelExec) channel).setErrStream(new ErrorOutputStream(new IWriter() { @Override public void write(String content) { trace(processID, content); } @Override public void write(String content, Exception e) { trace(processID, content, e); } })); channel.connect(); InputStream in = channel.getInputStream(); reader = new BufferedReader(new InputStreamReader(in)); String buf = null; while ((buf = reader.readLine()) != null) { if (ps != null) { ps.println(buf); } trace(processID, buf); } } catch (IOException e) { trace(processID, e.getMessage(), e); } catch (JSchException e) { trace(processID, e.getMessage(), e); } finally { try { channel.disconnect(); reader.close(); } catch (IOException e) { trace(processID, e.getMessage(), e); } } } /** * 执行相关的命令 * @throws JSchException */ public static void execCmd(String command, String user, String passwd, String host, final String processID, PrintStream ps) throws JSchException { Session session = getSession(user, passwd, host); try { execCmd(session, command, processID, ps); } finally { session.disconnect(); } } private static void trace(String processID, String message) { trace(processID, message, null); } private static void trace(String processID, String message, Throwable e) { MemCachedManager memCachedManager = MemCachedManager.getInstance(); Object progress = memCachedManager.get(processID); if (progress == null) { progress = new Progress(processID); } List<ProgressMessage> messages = ((Progress) progress).getMessages(); if (e == null) { log.info("[Shell Processing:" + processID + "]" + message); messages.add(new ProgressMessage(message)); } else { messages.add(new ProgressMessage(message, true)); if (!StringUtils.isEmpty(e.getMessage())) { messages.add(new ProgressMessage("Error details:" + e.getMessage(), true)); log.error("[Shell Processing:" + processID + "]" + message, e); } else { log.error("[Shell Processing:" + processID + "]" + message); } ((Progress) progress).setHasError(true); } Date expiry = new Date(System.currentTimeMillis() + (1000 * 60 * 60));// 有效期一个小时 memCachedManager.set(processID, progress, expiry); } public static void main(String[] args) { try { execCmd("hadoop distcp -overwrite hdfs://172.18.149.42:50070/tmp/dmp/ode/all_click_stream_data hdfs://yh/dmp/external/ode/all_click_stream_data", "dmp", "1234qwer", "172.18.149.134", "test"); //System.out.println(System.getProperty("line.separator")); } catch (Exception e) { e.printStackTrace(); } } }