java实现linux连接操作

此程序需要ganymed-ssh2-build210.jar包。
下载地址:http://www.ganymed.ethz.ch/ssh2/
为了调试方便,可以将\ganymed-ssh2-build210\src下的代码直接拷贝到我们的工程里,
此源码的好处就是没有依赖很多其他的包,拷贝过来干干净净。

此程序的目的是执行远程机器上的Shell脚本。
远程机器IP:***.**.**.***
用户名:sshapp
密码:sshapp
登录后用pwd命令,显示当前目录为:/sshapp.
在/sshapp/myshell/目录下有myTest.sh文件,内容如下:

public class RmtShellExecutor {
java实现linux连接操作    
java实现linux连接操作    
java实现linux连接操作    private Connection conn;
java实现linux连接操作    
java实现linux连接操作    private String     ip;
java实现linux连接操作    
java实现linux连接操作    private String     usr;
java实现linux连接操作    
java实现linux连接操作    private String     psword;
java实现linux连接操作    private String     charset = Charset.defaultCharset().toString();
java实现linux连接操作
java实现linux连接操作    private static final int TIME_OUT = 1000 * 5 * 60;
java实现linux连接操作
java实现linux连接操作    
java实现linux连接操作    public RmtShellExecutor(ShellParam param) {
java实现linux连接操作        this.ip = param.getIp();
java实现linux连接操作        this.usr = param.getUsername();
java实现linux连接操作        this.psword = param.getPassword();
java实现linux连接操作    }
java实现linux连接操作
java实现linux连接操作    
java实现linux连接操作    public RmtShellExecutor(String ip, String usr, String ps) {
java实现linux连接操作        this.ip = ip;
java实现linux连接操作        this.usr = usr;
java实现linux连接操作        this.psword = ps;
java实现linux连接操作    }
java实现linux连接操作
java实现linux连接操作    
java实现linux连接操作    private boolean login() throws IOException {
java实现linux连接操作        conn = new Connection(ip);
java实现linux连接操作        conn.connect();
java实现linux连接操作        return conn.authenticateWithPassword(usr, psword);
java实现linux连接操作    }
java实现linux连接操作
java实现linux连接操作    
java实现linux连接操作    public int exec(String cmds) throws Exception {
java实现linux连接操作        InputStream stdOut = null;
java实现linux连接操作        InputStream stdErr = null;
java实现linux连接操作        String outStr = "";
java实现linux连接操作        String outErr = "";
java实现linux连接操作        int ret = -1;
java实现linux连接操作        try {
java实现linux连接操作            if (login()) {
java实现linux连接操作                // Open a new {@link Session} on this connection
java实现linux连接操作                Session session = conn.openSession();
java实现linux连接操作                // Execute a command on the remote machine.
java实现linux连接操作                session.execCommand(cmds);
java实现linux连接操作                
java实现linux连接操作                stdOut = new StreamGobbler(session.getStdout());
java实现linux连接操作                outStr = processStream(stdOut, charset);
java实现linux连接操作                
java实现linux连接操作                stdErr = new StreamGobbler(session.getStderr());
java实现linux连接操作                outErr = processStream(stdErr, charset);
java实现linux连接操作                
java实现linux连接操作                session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);
java实现linux连接操作                
java实现linux连接操作                System.out.println("outStr=" + outStr);
java实现linux连接操作                System.out.println("outErr=" + outErr);
java实现linux连接操作                
java实现linux连接操作                ret = session.getExitStatus();
java实现linux连接操作            } else {
java实现linux连接操作                throw new AppException("登录远程机器失败" + ip); // 自定义异常类 实现略
java实现linux连接操作            }
java实现linux连接操作        } finally {
java实现linux连接操作            if (conn != null) {
java实现linux连接操作                conn.close();
java实现linux连接操作            }
java实现linux连接操作            IOUtils.closeQuietly(stdOut);
java实现linux连接操作            IOUtils.closeQuietly(stdErr);
java实现linux连接操作        }
java实现linux连接操作        return ret;
java实现linux连接操作    }
java实现linux连接操作
java实现linux连接操作    
java实现linux连接操作    private String processStream(InputStream in, String charset) throws Exception {
java实现linux连接操作        byte[] buf = new byte[1024];
java实现linux连接操作        StringBuilder sb = new StringBuilder();
java实现linux连接操作        while (in.read(buf) != -1) {
java实现linux连接操作            sb.append(new String(buf, charset));
java实现linux连接操作        }
java实现linux连接操作        return sb.toString();
java实现linux连接操作    }
java实现linux连接操作
java实现linux连接操作    public static void main(String args[]) throws Exception {
java实现linux连接操作        RmtShellExecutor exe = new RmtShellExecutor("***.**.**.***", "sshapp", "sshapp");
java实现linux连接操作        // 执行myTest.sh 参数为java Know dummy
java实现linux连接操作        System.out.println(exe.exec("sh /webapp/myshell/myTest.sh java Know dummy"));
java实现linux连接操作//        exe.exec("uname -a && date && uptime && who");
java实现linux连接操作    }
java实现linux连接操作}

注:一般情况下shell脚本正常执行完毕,getExitStatus方法返回0。
此方法通过远程命令取得Exit Code/status。但并不是每个server设计时都会返回这个值,如果没有则会返回null。
在调用getExitStatus时,要先调用WaitForCondition方法,通过ChannelCondition.java接口的定义可以看到每个条件的具体含义
在实际应用中,可以将outStr和outErr记录到日志中,以便维护人员查看shell的执行情况,
而getExitStatus的返回值,可以认为是此次执行是否OK的标准。

相关推荐