public classShellUtils {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";privateShellUtils() {throw newAssertionError();
}/**
* 查看是否有了root权限
*
* @return*/
public staticboolean checkRootPermission() {return execCommand("echo root", true, false).result == 0;
}/**
* 执行shell命令,默认返回结果
*
* @param command
* command
* @param 运行是否需要root权限
* @return
* @see ShellUtils#execCommand(String[], boolean, boolean)*/
public staticCommandResult execCommand(String command, boolean isRoot) {return execCommand(new String[] { command }, isRoot, true);
}/**
* 执行shell命令,默认返回结果
*
* @param commands
* command list
* @param 运行是否需要root权限
* @return
* @see ShellUtils#execCommand(String[], boolean, boolean)*/
public static CommandResult execCommand(Listcommands,
boolean isRoot) {returnexecCommand(
commands== null ? null : commands.toArray(newString[] {}),
isRoot,true);
}/**
* 执行shell命令,默认返回结果
*
* @param commands
* command array
* @param 运行是否需要root权限
* @return
* @see ShellUtils#execCommand(String[], boolean, boolean)*/
public staticCommandResult execCommand(String[] commands, boolean isRoot) {return execCommand(commands, isRoot, true);
}/**
* execute shell command
*
* @param command
* command
* @param 运行是否需要root权限
* @param isNeedResultMsg
* whether need result msg
* @return
* @see ShellUtils#execCommand(String[], boolean, boolean)*/
public staticCommandResult execCommand(String command, boolean isRoot,
boolean isNeedResultMsg) {return execCommand(newString[] { command }, isRoot, isNeedResultMsg);
}/**
* execute shell commands
*
* @param commands
* command list
* @param 运行是否需要root权限
* @param 是否需要返回运行结果
* @return
* @see ShellUtils#execCommand(String[], boolean, boolean)*/
public static CommandResult execCommand(Listcommands,
boolean isRoot, boolean isNeedResultMsg) {returnexecCommand(
commands== null ? null : commands.toArray(newString[] {}),
isRoot, isNeedResultMsg);
}/**
* execute shell commands
*
* @param commands
* command array
* @param 运行是否需要root权限
* @param 是否需要返回运行结果
* @return
*
if isNeedResultMsg is false, {@link CommandResult#successMsg}* is null and {@link CommandResult#errorMsg} is null.
*
if {@link CommandResult#result} is -1, there maybe some* excepiton.
*
*/public staticCommandResult 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= newDataOutputStream(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= newStringBuilder();
errorMsg= newStringBuilder();
successResult= new BufferedReader(newInputStreamReader(
process.getInputStream()));
errorResult= new BufferedReader(newInputStreamReader(
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());
}/**
* 运行结果
*
*
{@link CommandResult#result} means result of command, 0 means normal,* else means error, same to excute in linux shell
*
{@link CommandResult#successMsg} means success message of command* result
*
{@link CommandResult#errorMsg} means error message of command result*
*
* @author Trinea
* 2013-5-16*/
public static classCommandResult {/** 运行结果 **/
public intresult;/** 运行成功结果 **/
publicString successMsg;/** 运行失败结果 **/
publicString errorMsg;public CommandResult(intresult) {this.result =result;
}public CommandResult(intresult, String successMsg, String errorMsg) {this.result =result;this.successMsg =successMsg;this.errorMsg =errorMsg;
}
}
}