您的位置:首页 > 运维架构 > Shell

android 执行命令的shell工具类

2017-08-10 12:20 351 查看
package cn.trinea.android.common.util;

import java.io.BufferedReader;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.List;

/**

 * ShellUtils

 * <ul>

 * <strong>Check root</strong>

 * <li>{@link ShellUtils#checkRootPermission()}</li>

 * </ul>

 * <ul>

 * <strong>Execte command</strong>

 * <li>{@link ShellUtils#execCommand(String, boolean)}</li>

 * <li>{@link ShellUtils#execCommand(String, boolean, boolean)}</li>

 * <li>{@link ShellUtils#execCommand(List, boolean)}</li>

 * <li>{@link ShellUtils#execCommand(List, boolean, boolean)}</li>

 * <li>{@link ShellUtils#execCommand(String[], boolean)}</li>

 * <li>{@link ShellUtils#execCommand(String[], boolean, boolean)}</li>

 * </ul>

 * 

 * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2013-5-16

 */

public class ShellUtils {

    public static final String COMMAND_SU       = "su";

    public static final String COMMAND_SH       = "sh";

    public static final String COMMAND_EXIT     = "exit\n";

    public static final String COMMAND_LINE_END = "\n";

    private ShellUtils() {

        throw new AssertionError();

    }

    /**

     * check whether has root permission

     * 

     * @return

     */

    public static boolean checkRootPermission() {

        return execCo
4000
mmand("echo root", true, false).result == 0;

    }

    /**

     * execute shell command, default return result msg

     * 

     * @param command command

     * @param isRoot whether need to run with root

     * @return

     * @see ShellUtils#execCommand(String[], boolean, boolean)

     */

    public static CommandResult execCommand(String command, boolean isRoot) {

        return execCommand(new String[] {command}, isRoot, true);

    }

    /**

     * execute shell commands, default return result msg

     * 

     * @param commands command list

     * @param isRoot whether need to run with root

     * @return

     * @see ShellUtils#execCommand(String[], boolean, boolean)

     */

    public static CommandResult execCommand(List<String> commands, boolean isRoot) {

        return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, true);

    }

    /**

     * execute shell commands, default return result msg

     * 

     * @param commands command array

     * @param isRoot whether need to run with root

     * @return

     * @see ShellUtils#execCommand(String[], boolean, boolean)

     */

    public static CommandResult execCommand(String[] commands, boolean isRoot) {

        return execCommand(commands, isRoot, true);

    }

    /**

     * execute shell command

     * 

     * @param command command

     * @param isRoot whether need to run with root

     * @param isNeedResultMsg whether need result msg

     * @return

     * @see ShellUtils#execCommand(String[], boolean, boolean)

     */

    public static CommandResult execCommand(String command, boolean isRoot, boolean isNeedResultMsg) {

        return execCommand(new String[] {command}, isRoot, isNeedResultMsg);

    }

    /**

     * execute shell commands

     * 

     * @param commands command list

     * @param isRoot whether need to run with root

     * @param isNeedResultMsg whether need result msg

     * @return

     * @see ShellUtils#execCommand(String[], boolean, boolean)

     */

    public static CommandResult execCommand(List<String> commands, boolean isRoot, boolean isNeedResultMsg) {

        return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, isNeedResultMsg);

    }

    /**

     * execute shell commands

     * 

     * @param commands command array

     * @param isRoot whether need to run with root

     * @param isNeedResultMsg whether need result msg

     * @return <ul>

     *         <li>if isNeedResultMsg is false, {@link CommandResult#successMsg} is null and

     *         {@link CommandResult#errorMsg} is null.</li>

     *         <li>if {@link CommandResult#result} is -1, there maybe some excepiton.</li>

     *         </ul>

     */

    public static CommandResult execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg) {

        int result = -1;

        if (commands == null || commands.length == 0) {

            return new CommandResult(result, null, null);

        }

        Process process = null;

        BufferedReader successResult = null;

        BufferedReader errorResult = null;

        StringBuilder successMsg = null;

        StringBuilder errorMsg = null;

        DataOutputStream os = null;

        try {

            process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH);

            os = new DataOutputStream(process.getOutputStream());

            for (String command : commands) {

                if (command == null) {

                    continue;

                }

                // donnot use os.writeBytes(commmand), avoid chinese charset error

                os.write(command.getBytes());

                os.writeBytes(COMMAND_LINE_END);

                os.flush();

            }

            os.writeBytes(COMMAND_EXIT);

            os.flush();

            result = process.waitFor();

            // get command result

            if (isNeedResultMsg) {

                successMsg = new StringBuilder();

                errorMsg = new StringBuilder();

                successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));

                errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));

                String s;

                while ((s = successResult.readLine()) != null) {

                    successMsg.append(s);

                }

                while ((s = errorResult.readLine()) != null) {

                    errorMsg.append(s);

                }

            }

        } catch (IOException e) {

            e.printStackTrace();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            try {

                if (os != null) {

                    os.close();

                }

                if (successResult != null) {

                    successResult.close();

                }

                if (errorResult != null) {

                    errorResult.close();

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

            if (process != null) {

                process.destroy();

            }

        }

        return new CommandResult(result, successMsg == null ? null : successMsg.toString(), errorMsg == null ? null

                : errorMsg.toString());

    }

    /**

     * result of command

     * <ul>

     * <li>{@link CommandResult#result} means result of command, 0 means normal, else means error, same to excute in

     * linux shell</li>

     * <li>{@link CommandResult#successMsg} means success message of command result</li>

     * <li>{@link CommandResult#errorMsg} means error message of command result</li>

     * </ul>

     * 

     * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2013-5-16

     */

    public static class CommandResult {

        /** result of command **/

        public int    result;

        /** success message of command result **/

        public String successMsg;

        /** error message of command result **/

        public String errorMsg;

        public CommandResult(int result) {

            this.result = result;

        }

        public CommandResult(int result, String successMsg, String errorMsg) {

            this.result = result;

            this.successMsg = successMsg;

            this.errorMsg = errorMsg;

        }

    }
}

转载: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ShellUtils.java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: