zoukankan      html  css  js  c++  java
  • Java SSH 不使用终端也能调用环境变量中的指令

    不使用终端也能调用环境变量中的指令

    类库的GitHub,https://github.com/hudson/ganymed-ssh-2
    后续需要改造下代码,看看能不能更加的精简

    依赖

    <dependency>
       <groupId>ch.ethz.ganymed</groupId>
       <artifactId>ganymed-ssh2</artifactId>
       <version>262</version>
    </dependency>
    
    <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
       <version>2.5</version>
    </dependency>
    

    代码

    package wiki.mysite.ssh2;
    
    import java.io.*;
    import java.nio.charset.Charset;
    import ch.ethz.ssh2.ChannelCondition;
    import ch.ethz.ssh2.Connection;
    import ch.ethz.ssh2.Session;
    import ch.ethz.ssh2.StreamGobbler;
    import org.apache.commons.io.IOUtils;
    
    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;
    
        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()) {
                    // Open a new {@link Session} on this connection
                    Session session = conn.openSession();
                    // Execute a command on the remote machine.
                    session.execCommand(cmds);
                    stdOut = new StreamGobbler(session.getStdout());
                    outStr = processStream(stdOut, charset);
    
                    stdErr = new StreamGobbler(session.getStderr());
                    outErr = processStream(stdErr, charset);
    
                    session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);
    
    //                System.out.println("outStr=" + outStr);
                    System.out.println(outStr);
    //                System.out.println("outErr=" + outErr);
                    System.out.println(outErr);
    
                    ret = session.getExitStatus();
                } else {
                    throw new Exception("登录远程机器失败" + ip); // 自定义异常类 实现略
                }
            } finally {
                if (conn != null) {
                    conn.close();
                }
                IOUtils.closeQuietly(stdOut);
                IOUtils.closeQuietly(stdErr);
            }
            return ret;
        }
    
        private String processStream(InputStream in, String charset) throws Exception {
            byte[] buf = new byte[1024];
            StringBuilder sb = new StringBuilder();
            while (in.read(buf) != -1) {
                sb.append(new String(buf, charset));
            }
            return sb.toString();
        }
    
        public static void main(String args[]) throws Exception {
            RemoteShellExecutor executor = new RemoteShellExecutor("192.168.0.107", "root", "123456");
            // 执行myTest.sh 参数为java Know dummy
            System.out.println(executor.exec("sh t1.sh"));
            
        }
    }
    

    t1.sh

    echo 'hi'
    source ~/.bash_profile
    ll
    java -version
    

    思路就是把你要执行的shell,放到一个文件中,然后在这个文件的开头执行source ~/.bash_profile,这样环境变量就生效了,然后你可以达到调用命令的目的了

    效果图

    参考:
    java 远程执行Shell命令-通过ganymed-ssh2连接
    https://www.jianshu.com/p/513c72dfee1b

  • 相关阅读:
    提升CPU性能的几个方面
    浅谈CPU性能问题
    计算机组成原理 1— 冯.诺依曼体系结构
    让你的微信公众平台中支持QQ在线客服功能
    common.js
    layui中解决ashx筛选数据时中文乱码问题
    html 使用rem开发
    html有用的占位符
    前端教学网站
    纯js实现回到锚点
  • 原文地址:https://www.cnblogs.com/renguanyu/p/15225633.html
Copyright © 2011-2022 走看看