工具类-Linux-SSH处理类

龙令雪
2023-12-01

ssh工具类

工具类一

package com.alipay.api.com.cn.test.sslTest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


import com.trilead.ssh2.Connection;
import com.trilead.ssh2.SCPClient;
import com.trilead.ssh2.Session;
import com.trilead.ssh2.StreamGobbler;

/**
 * <p> @Description </p>
 * <p> @company Asiainfo-linkage (NJ) </p>
 * <p> @author 闫瑞国 </p>
 * <p> @Email yanrg@asiainfo-linkage.com </p>
 * <p> @createDate 2012-6-23 下午10:40:53 </p>
 * <p> @modifyDate </p>
 * <p> @version 1.0 </p>
 */
public final class SSHUtils {


    public static String ssh4Shell(String ip, int sshPort, String username, String password, String shellName, String shell) throws Exception {
        return ssh4Shell(ip, sshPort, username, password, shellName, null, shell);
    }

    public static String ssh4Shell(String ip, int sshPort, String username, String password, String shellName, String parameters, String shell) throws Exception {
        String rtn = null;
        Connection conn = null;
        Session sess = null;
        try {
            conn = new Connection(ip, sshPort);

            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username, password);

            if (!(isAuthenticated)) {
                throw new IOException("认证失败");
            }

            String fileName = shellName + ".sh";

            upload(conn, ip, sshPort, username, password, shell.getBytes(), "/tmp/", fileName);
            sess = conn.openSession();

            if (parameters.equals("")||parameters==null) {
                sess.execCommand(" chmod +x /tmp/" + fileName + " && /tmp/" + fileName + " && rm -rf /tmp/" + fileName);
            } else {
                sess.execCommand(" chmod +x /tmp/" + fileName + " && /tmp/" + fileName + " " + parameters + "  && rm -rf /tmp/" + fileName);
            }
            InputStream stdout = new StreamGobbler(sess.getStdout());
            BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
            while (true) {
                String line = br.readLine();
                if (line == null) {
                    break;
                }

                rtn = line;
            }

        } catch (Exception ex) {
        } finally {
            if (sess != null) {
                sess.close();
            }
            if (conn != null) {
                conn.close();
            }
        }

        return rtn;
    }

    public static String[] ssh4Shell(String ip, int sshPort, String username, String password, String[] shellName, String[] shell) throws Exception {
        return ssh4Shell(ip, sshPort, username, password, shellName, null, shell);
    }

    public static String[] ssh4Shell(String ip, int sshPort, String username, String password, String[] shellName, String[] parameters, String[] shell) throws Exception {
        String[] rtn = new String[shellName.length];
        Connection conn = null;
        try {
            conn = new Connection(ip, sshPort);

            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username, password);

            if (!(isAuthenticated)) {
                throw new IOException("认证失败");
            }

            String[] fileName = new String[shellName.length];

            byte[][] b = new byte[shellName.length][];
            for (int i = 0; i < shellName.length; ++i) {
                fileName[i] = shellName[i] + ".sh";
                b[i] = shell[i].getBytes();
            }
            upload(conn, ip, sshPort, username, password, b, "/tmp/", fileName);

            for (int i = 0; i < shellName.length; i++) {
                Session sess = conn.openSession();
                try {
                    if ((parameters == null) || (parameters[i]).equals("")) {
                        sess.execCommand(" chmod +x /tmp/" + fileName[i] + " && /tmp/" + fileName[i] + " && rm -rf /tmp/" + fileName[i]);
                    } else {
                        sess.execCommand(" chmod +x /tmp/" + fileName[i] + " && /tmp/" + fileName[i] + " " + parameters[i] + "  && rm -rf /tmp/" + fileName[i]);
                    }
                    InputStream stdout = new StreamGobbler(sess.getStdout());
                    BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
                    while (true) {
                        String line = br.readLine();
                        if (line == null) {
                            break;
                        }

                        rtn[i] = line;
                    }

                } catch (Exception ex) {
                } finally {
                    if (sess != null)
                        sess.close();
                }
            }
        } catch (Exception ex) {
        } finally {
            if (conn != null) {
                conn.close();
            }
        }

        return rtn;
    }

    public static String ssh4Command(String ip, int sshPort, String username, String password, String command) throws Exception {

        StringBuilder rtn = new StringBuilder();
        Connection conn = null;
        Session sess = null;
        try {
            conn = new Connection(ip, sshPort);

            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username, password);

            if (!(isAuthenticated)) {
                throw new IOException("认证失败");
            }

            sess = conn.openSession();

            sess.execCommand(command);
            InputStream stdout = new StreamGobbler(sess.getStdout());
            BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
            while (true) {
                String line = br.readLine();
                if (line == null) {
                    break;
                }else {
                    if(line.equals("")){
                        rtn.append(line);
                    }

                }

            }

        } catch (Exception ex) {
            throw ex;
        } finally {
            if (sess != null) {
                sess.close();
            }
            if (conn != null) {
                conn.close();
            }
        }

        return rtn.toString();
    }


    public static void upload(Connection conn, String ip, int sshPort, String username, String password, byte[] bytes, String destPath, String fileName) throws Exception {
        try {
            SCPClient scp = conn.createSCPClient();
            scp.put(bytes, fileName, destPath);
        } catch (Exception ex) {
            throw ex;
        }
    }

    public static void upload(Connection conn, String ip, int sshPort, String username, String password, byte[][] bytes, String destPath, String[] fileName) throws Exception {
        try {
            SCPClient scp = conn.createSCPClient();
            for (int i = 0; i < fileName.length; ++i)
                scp.put(bytes[i], fileName[i], destPath);
        } catch (Exception ex) {
            throw ex;
        }
    }

    public static String ssh4Command(String ip, int sshPort, String username, String password, String command,boolean isSynch) throws Exception {

        StringBuilder rtn = new StringBuilder();
        Connection conn = null;
        Session sess = null;
        try {
            conn = new Connection(ip, sshPort);

            conn.connect();
            boolean isAuthenticated = conn.authenticateWithPassword(username, password);

            if (!(isAuthenticated)) {
                throw new IOException("认证失败");
            }

            sess = conn.openSession();
            sess.execCommand(command);

            InputStream stdout = new StreamGobbler(sess.getStdout());
            BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
            while (true) {
                String line = br.readLine();
                if (line == null) {
                    break;
                }else {
                    if(line.equals("")){
                        rtn.append(line);
                        if(!isSynch && "---------------------".equals(line)){
                            break;
                        }
                    }

                }

            }

        } catch (Exception ex) {
            throw ex;
        } finally {
            if (sess != null) {
                sess.close();
            }
            if (conn != null) {
                conn.close();
            }
        }

        return rtn.toString();
    }


/*
    public static void runSSH(DTOAmBatchWfPs[] batchWfPsValues, long wfFlowId, String regionId, long billDay,long billlingCycleId) throws Exception {
        if(batchWfPsValues==null || batchWfPsValues.length<1){
            //节点-[{0}]-没有配置AM_BATCH_WF_PS,无法完成
            ExceptionUtil.throwBusinessException("AMS0700505",Long.toString(wfFlowId));
        }
        long acctMode = 0;
        long modeValue = 0;

        for (int i = 0; i < batchWfPsValues.length; i++) {
            acctMode += batchWfPsValues[i].getThreadNum();
        }

        StringBuilder command = new StringBuilder();

        for (int i = 0; i < batchWfPsValues.length; i++) {
            command.delete(0, command.length());

            command.append("cd ").append(batchWfPsValues[i].getShellCatalog())
                    .append(" && ")
                    .append(batchWfPsValues[i].getMonitorShell());

            if(log.isInfoEnabled()){
                log.info("SSH Command : "+command);
            }

            String rtn = SSHUtil.ssh4Command(batchWfPsValues[i].getHostIp(), batchWfPsValues[i].getPort(),
                    batchWfPsValues[i].getUserName(), K.k_s(batchWfPsValues[i].getPassword()), command.toString());

            if(StringUtils.isNotBlank(rtn) && rtn.equals("PROCESS_EXIST")){
                String[] args = new String[]{batchWfPsValues[i].getHostIp(),Long.toString(batchWfPsValues[i].getPort())
                        ,batchWfPsValues[i].getUserName(),batchWfPsValues[i].getWfProcessName(),
                        batchWfPsValues[i].getShellCatalog()+"/"+batchWfPsValues[i].getMonitorShell()};
                //IP-{0}端口-{1}-用户名-{2}-进程-{3}-监控脚本位置-{4},进程已存在
                ExceptionUtil.throwBusinessException("AMS0700545", args);
            }

            command.delete(0, command.length());
            command.append("cd ").append(batchWfPsValues[i].getShellCatalog())
                    .append(" && ")
                    .append(batchWfPsValues[i].getStartShell())
                    .append(" ").append(regionId)
                    .append(":").append(billDay)
                    .append(":").append(billlingCycleId)
                    .append(":").append(wfFlowId)
                    .append(":").append(batchWfPsValues[i].getWfProcessId())
                    .append(":").append(acctMode)
                    .append(":").append(modeValue).append("-").append((modeValue+batchWfPsValues[i].getThreadNum())-1);

            if(StringUtils.isNotBlank(batchWfPsValues[i].getParas())){
                command.append(":").append(batchWfPsValues[i].getParas());
            }

            modeValue += modeValue+batchWfPsValues[i].getThreadNum();

            if(log.isInfoEnabled()){
                log.info("SSH Command : "+command);
            }

            SSHUtils.ssh4Command(batchWfPsValues[i].getHostIp(), batchWfPsValues[i].getPort(),
                    batchWfPsValues[i].getUserName(), K.k_s(batchWfPsValues[i].getPassword()), command.toString());

        }
    }
*/
}

工具类二

package com.xxx.api.com.cn.test.sslTest;

import com.jcraft.jsch.*;


import java.io.BufferedReader;

import java.io.InputStreamReader;
import java.util.ArrayList;

/**
 * Created by Administrator on 2018/10/10.
 */
public class Demo1 {

    //远程主机的ip地址
    private String ip;
    //远程主机登录用户名
    private String username;
    //远程主机的登录密码
    private String password;
    //设置ssh连接的远程端口
    public static final int DEFAULT_SSH_PORT = 22;
    //保存输出内容的容器
    private ArrayList<String> stdout;

    /**
     * 初始化登录信息
     * @param ip
     * @param username
     * @param password
     */
    public Demo1(final String ip, final String username, final String password) {
        this.ip = ip;
        this.username = username;
        this.password = password;
        stdout = new ArrayList<String>();
    }
    /**
     * 执行shell命令
     * @param command
     * @return
     */
    public int execute(final String command) {
        int returnCode = 0;
        JSch jsch = new JSch();
//        MyUserInfo userInfo = new MyUserInfo();

        try {
            //创建session并且打开连接,因为创建session之后要主动打开连接
            Session session = jsch.getSession(username, ip, DEFAULT_SSH_PORT);
            session.setPassword(password);

            session.setConfig("StrictHostKeyChecking", "no");
//            session.setUserInfo(UserInfo);
            session.connect();

            //打开通道,设置通道类型,和执行的命令
            Channel channel = session.openChannel("exec");//exec
            ChannelExec channelExec = (ChannelExec)channel;
            channelExec.setCommand(command);

            channelExec.setInputStream(null);
            BufferedReader input = new BufferedReader(new InputStreamReader
                    (channelExec.getInputStream()));

            channelExec.connect();
            System.out.println("The remote command is :" + command);

            //接收远程服务器执行命令的结果
            String line;
            while ((line = input.readLine()) != null) {
                stdout.add(line);
            }
            input.close();

            // 得到returnCode
            if (channelExec.isClosed()) {
                returnCode = channelExec.getExitStatus();
            }

            // 关闭通道
            channelExec.disconnect();
            //关闭session
            session.disconnect();

        } catch (JSchException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return returnCode;
    }
    /**
     * get stdout
     * @return
     */
    public ArrayList<String> getStandardOutput() {
        return stdout;
    }

    public static void main(final String [] args) throws Exception {
         Demo1 shell = new Demo1("10.3.3.182", "aiprodcfg", "aiprodcfg#_1213");
        shell.execute("ls");

        ArrayList<String> stdout = shell.getStandardOutput();
        for (String str : stdout) {
            System.out.println(str);
        }
    }



}

MyUserInfo.java

package com.xxx.api.com.cn.test.sslTest;

/**
 * Created by Administrator on 2018/10/10.
 */
import com.jcraft.jsch.UserInfo;

public class MyUserInfo implements UserInfo {

    @Override
    public String getPassphrase() {
        // TODO Auto-generated method stub
        System.out.println("MyUserInfo.getPassphrase()");
        return null;
    }

    @Override
    public String getPassword() {
        // TODO Auto-generated method stub
        System.out.println("MyUserInfo.getPassword()");
        return null;
    }

    @Override
    public boolean promptPassphrase(String arg0) {
        // TODO Auto-generated method stub
        System.out.println("MyUserInfo.promptPassphrase()");
        System.out.println(arg0);
        return false;
    }

    @Override
    public boolean promptPassword(String arg0) {
        // TODO Auto-generated method stub
        System.out.println("MyUserInfo.promptPassword()");
        System.out.println(arg0);
        return false;
    }

    @Override
    public boolean promptYesNo(String arg0) {
        // TODO Auto-generated method stub'
        System.out.println("MyUserInfo.promptYesNo()");
        System.out.println(arg0);
        if (arg0.contains("The authenticity of host")) {
            return true;
        }
        return true;
    }

    @Override
    public void showMessage(String arg0) {
        // TODO Auto-generated method stub
        System.out.println("MyUserInfo.showMessage()");
    }

}

 类似资料: