• SshTerminal


    package com.network.ssh;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.net.InetSocketAddress;
    
    import org.apache.sshd.ClientChannel;
    import org.apache.sshd.ClientSession;
    import org.apache.sshd.SshClient;
    import org.apache.sshd.client.future.AuthFuture;
    import org.apache.sshd.common.util.NoCloseInputStream;
    import org.apache.sshd.common.util.NoCloseOutputStream;
    
    public class SshTerminal {
        public static final int DEFAULT_SSH_PORT = 22;
        public static final String ENTER = "
    ";
        public static final String EXIT = "exit";
        private SshClient client;
        private ClientSession session;
        private ClientChannel channel;
        private ByteArrayInputStream input;
        private ByteArrayOutputStream output;
        private StringBuffer remoteInfo = new StringBuffer();
        private boolean isLogin = false;
        public SshTerminal() {
            client = SshClient.setUpDefaultClient();
            client.start();
        }
        public boolean login(String ip,String userName,String password) throws InterruptedException, IOException{
            return login(ip, DEFAULT_SSH_PORT, userName, password);
        }
        
        public boolean login(String ip,int port,String userName,String password) throws InterruptedException, IOException{
            closeSession();
            session = client.connect(userName, new InetSocketAddress(ip, port)).await().getSession();
            session.addPasswordIdentity(password);
            AuthFuture future = session.auth().await();
            isLogin = future.isSuccess();
            return isLogin;
        }
        
        public void runCMD(String...scripts) throws Exception{
            if(!isLogin) throw new Exception("not login!");
            StringBuffer buffer = new StringBuffer();
            for(String cmd : scripts){
                buffer.append(cmd.trim()).append(ENTER);
            }
            /**
             * createShellChannel() create a blocking channel ,use exit release
             */
            buffer.append(EXIT).append(ENTER);
            closeChannel();
            input = new ByteArrayInputStream(buffer.toString().getBytes());
            channel = session.createShellChannel();
            channel.setIn(new NoCloseInputStream(input));
            open();
        }
        
        public void runCMD(String cmd) throws Exception{
            if(!isLogin) throw new Exception("not login!");
            closeChannel();
            channel = session.createExecChannel(cmd);
            open();
        }
        private void open() throws IOException{
            //session will close,so need to new
            output = new ByteArrayOutputStream();
            channel.setOut(new NoCloseOutputStream(output));
            channel.setErr(new NoCloseOutputStream(output));
            channel.open();
            channel.waitFor(ClientChannel.CLOSED, 0);
        }
        
        private void closeStream(){
            try{
                if(input != null){
                    input.close();
                    input = null;
                }
                if(output != null){
                    remoteInfo.append(output.toString());
                    output.close();
                    output = null;
                }
            }catch(IOException e){
                e.printStackTrace();
            }
        }
        
        private void closeChannel(){
            closeStream();
            if(channel != null){
                channel.close(true);
                channel = null;
            }    
        }
        
        private void closeSession(){
            closeChannel();
            if (session != null) {
                session.close(true);
                session = null;
            }
        }
        
        public void destory() {
            closeSession();
            client.stop();
            client = null;
        }
        public String getRemoteInfo() throws Exception{
            //the end od if the output not close
            if(output != null) remoteInfo.append(output.toString());
            return remoteInfo.toString();
        }
    }
  • 相关阅读:
    Ajax和Jsonp的工作原理,以及区别。
    git与GitHub
    Cookie的作用以及封装的方法
    关于angular-route后获取路由标签的一些问题
    javascriptDOM节点
    字符串转化为对象的方法
    将"goOd gooD stUdy dAy dAy up"每个单词的首字母转换成大写其余还是小写字母
    利用HashSet对list集合去重
    集合之Iterator迭代器
    java常用API之System类
  • 原文地址:https://www.cnblogs.com/wellla/p/4200819.html
Copyright © 2020-2023  润新知