博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java调用远程服务器shell脚本
阅读量:6368 次
发布时间:2019-06-23

本文共 3834 字,大约阅读时间需要 12 分钟。

1.代码

代码比较简单

package com.springboot.information.utils;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.nio.charset.Charset;import org.apache.commons.io.IOUtils;import ch.ethz.ssh2.ChannelCondition;import ch.ethz.ssh2.Connection;import ch.ethz.ssh2.Session;import ch.ethz.ssh2.StreamGobbler;public class RemoteShellExecutor {    private Connection conn;    /** 远程机器IP */    private String ip;    /** 用户名 */    private String osUsername;    /** 密码 */    private String password;    private String charset = Charset.defaultCharset().toString();    private static final int TIME_OUT = 1000 * 5 * 60;    /**     * 构造函数     * @param ip     * @param usr     * @param pasword     */    public RemoteShellExecutor(String ip, String usr, String pasword) {        this.ip = ip;        this.osUsername = usr;        this.password = pasword;    }    /**     * 登录     * @return     * @throws IOException     */    private boolean login() throws IOException {        conn = new Connection(ip);        conn.connect();        return conn.authenticateWithPassword(osUsername, password);    }    /**     * 执行脚本     *     * @param cmds     * @return     * @throws Exception     */    public int exec(String cmds) throws Exception {        InputStream stdOut = null;        InputStream stdErr = null;        String outStr = "";        String outErr = "";        int ret = -1;        try {            if (login()) {                System.out.println("login success");                // Open a new {@link Session} on this connection                Session session = conn.openSession();                // Execute a command on the remote machine.                System.out.println("session success");                session.execCommand(cmds);                System.out.println("exec:"+cmds);                System.out.println("session:"+session);                stdOut = new StreamGobbler(session.getStdout());                System.out.println("stdOut:"+stdOut.toString());                outStr = processStream(stdOut, charset);                System.out.println("stdOut");                stdErr = new StreamGobbler(session.getStderr());                outErr = processStream(stdErr, charset);                System.out.println("stdErr");                session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);                System.out.println("outStr=" + outStr);                System.out.println("outErr=" + outErr);                ret = session.getExitStatus();            } else {                throw new Exception("登录远程机器失败" + ip); // 自定义异常类 实现略            }        } finally {            if (conn != null) {                conn.close();            }            IOUtils.closeQuietly(stdOut);            IOUtils.closeQuietly(stdErr);        }        return ret;    }    /**     * @param in     * @param charset     * @return     * @throws IOException     * @throws UnsupportedEncodingException     */    private String processStream(InputStream in, String charset) throws Exception {        System.out.println("ininin");        byte[] buf = new byte[1024];        StringBuilder sb = new StringBuilder();        int num =0;        while (in.read(buf) != -1) {            num++;            System.out.println("number:"+num);            sb.append(new String(buf, charset));            System.out.println("sb:"+sb.toString());            System.out.println("buf:"+in.read(buf));        }        System.out.println("enene22");        return sb.toString();    }    public static void main(String args[]) throws Exception {        RemoteShellExecutor executor = new RemoteShellExecutor("XXXX", "XX", "XXX");        // 执行myTest.sh 参数为java Know dummy        System.out.println(executor.exec("/home/zh/Documents/start/note.sh"));    }}复制代码

转载于:https://juejin.im/post/5d072f08518825092c7171d5

你可能感兴趣的文章
如何学好C和C++
查看>>
Gitlab通过custom_hooks自动更新服务器代码
查看>>
python 如何判断调用系统命令是否执行成功
查看>>
Lesson10 vSphere 管理特性
查看>>
memcache 扩展和 memcached扩展安装
查看>>
好程序员的查克拉---自信
查看>>
线程池的设计(二):领导者追随者线程池的设计
查看>>
获取设备列表
查看>>
Django使用网上模板做个能展示的博客
查看>>
基于同IP不同端口,同端口不同Ip的虚拟主机 基于FQDN的虚拟主机
查看>>
项目软件集成三方模块,编译中int32和uint32定义冲突解决方法
查看>>
StretchDIBits速度测试(HALFTONE)
查看>>
在.NET Workflo“.NET研究”w 3.5中使用多线程提高工作流性能
查看>>
验证Oracle处理速度
查看>>
自己写一个jquery
查看>>
艾伟:C#中抽象类和接口的区别
查看>>
Flink - NetworkEnvironment
查看>>
BZOJ4374 : Little Elephant and Boxes
查看>>
【.Net Framework 体积大?】不安装.net framework 也能运行!?开篇叙述-1
查看>>
LLDP协议、STP协议 笔记
查看>>