java接口控制linux执行命令

java有api可以链接linux,并通过代码在linux上执行命令。例子如下:
我们先发起链接,返回一个登陆状态的

/**
     * 创建会话连接
     *
     * @param ip         主机IP
     * @param user       主机登陆用户名
     * @param pwd        主机登陆密码
     * @param port       主机ssh2登陆端口,如果取默认值,传-1
     * @param privateKey
     * @param passphrase
     */
    public static Session sshConnect(String ip, String user, String pwd, int port,
                                     String privateKey, String passphrase) throws Exception {

        //验证主机ip
        if (null == ip || "".equals(ip)) {
            logger.error("主机IP为空");

        }
        //验证主机登陆用户名
        if (null == user || "".equals(user)) {
            logger.error("主机登陆用户名为空");

        }

        //验证主机登陆密码
        if (null == pwd || "".equals(pwd)) {
            logger.error("主机登陆密码为空");
        }

        JSch jsch = new JSch();
        Session session = null;

        //设置密钥和密码
        if (privateKey != null && !"".equals(privateKey)) {
            if (passphrase != null && "".equals(passphrase)) {
                //设置带口令的密钥
                jsch.addIdentity(privateKey, passphrase);
            } else {
                //设置不带口令的密钥
                jsch.addIdentity(privateKey);
            }
        }

        if (port <= 0) {
            //连接服务器,采用默认端口
            session = jsch.getSession(user, ip);
        } else {
            //采用指定的端口连接服务器
            session = jsch.getSession(user, ip, port);
        }

        //如果服务器连接不上,则抛出异常
        if (null == session) {
            logger.error("ssh session is null");
        }

        //设置登陆主机的密码
        session.setPassword(pwd);//设置密码
        //设置第一次登陆的时候提示,可选值:(ask | yes | no)
        session.setConfig("StrictHostKeyChecking", "no");
        //设置登陆超时时间
        session.connect(10000);
        session.sendKeepAliveMsg();
        session.setServerAliveCountMax(10000);


        //返回会话
        return session;

    }

接着拿到session状态,继续对linux做操作,传入要执行的命令行

/**
     * 执行ssh远程命令
     *
     * @param ip
     * @param user
     * @param pwd
     * @param port
     * @param privateKey
     * @param passphrase
     * @param command    执行命令
     * @param
     */
    public static Boolean sshExecCmd(String ip, String user, String pwd, int port,
                                     String privateKey, String passphrase, String command) {

        try {
            //获取ssh连接会话
            Session session = sshConnect(ip, user, pwd, port,
                    privateKey, passphrase);

            if (null == session) {
                logger.error("创建ssh连接失败");
            }

            ChannelExec openChannel = (ChannelExec) session.openChannel("exec");
            logger.info("shell:" + command);
            openChannel.setCommand(command);

            openChannel.connect(10000);
            InputStream in = openChannel.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String buf;
            String result = "";
            while ((buf = reader.readLine()) != null) {
                result += buf.toString();
            }
            logger.info(result);
            in.close();
            reader.close();
            openChannel.disconnect();
            sshDisconnect(session);
            return true;
        } catch (Exception e) {
            logger.info(e.getMessage());
            return false;
        }

    }

最后是断开连接

/**
     * 关闭会话连接
     *
     * @param session
     */
    public static void sshDisconnect(Session session) throws Exception {

        if (null == session) {
            logger.error("ssh session is null,关闭session异常");
        }
        session.disconnect();

    }

该方法可用于执行项目的本地服务器,也可跨域操作有访问权限的其他服务器。

你可能感兴趣的:(java+linux)