DF1E 2014-10-02 18:25:12 +02:00
parent 2c62965a02
commit 564e55385f
2 changed files with 28 additions and 79 deletions

View File

@ -38,35 +38,40 @@ import java.io.BufferedReader;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.util.Log;
public class LinuxShell { public class LinuxShell {
public static String getCmdPath(String path) {
return path.replace(" ", "\\ ").replace("'", "\\'"); private static final String UNIX_ESCAPE_EXPRESSION = "(\\(|\\)|\\[|\\]|\\s|\'|\"|`|\\{|\\}|&|\\\\|\\?)";
public static String getCommandLineString(String input) {
return input.replaceAll(UNIX_ESCAPE_EXPRESSION, "\\\\$1");
} }
/**
* 返回执行完<EFBFBD><EFBFBD>?的结果
*
* @param cmd 命令内容
* @return
*/
public static BufferedReader execute(String cmd) { public static BufferedReader execute(String cmd) {
BufferedReader reader = null; //errReader = null; BufferedReader reader = null;
try { try {
Process process = Runtime.getRuntime().exec("su"); Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream()); DataOutputStream os = new DataOutputStream(
//os.writeBytes("mount -oremount,rw /dev/block/mtdblock3 /system\n"); process.getOutputStream());
//os.writeBytes("busybox cp /data/data/com.koushikdutta.superuser/su /system/bin/su\n");
os.writeBytes(cmd + "\n"); os.writeBytes(cmd + "\n");
os.writeBytes("exit\n"); os.writeBytes("exit\n");
reader = new BufferedReader(new InputStreamReader(process.getInputStream())); reader = new BufferedReader(new InputStreamReader(
String err = (new BufferedReader(new InputStreamReader(process.getErrorStream()))).readLine(); process.getInputStream()));
String err = (new BufferedReader(new InputStreamReader(
process.getErrorStream()))).readLine();
os.flush(); os.flush();
if (process.waitFor() != 0 || (!"".equals(err) && null != err)) { if (process.waitFor() != 0 || (!"".equals(err) && null != err)
&& containsIllegals(err) != true) {
Log.e("Root Error, cmd: " + cmd, err);
return null; return null;
} }
return reader; return reader;
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} catch (InterruptedException e) { } catch (InterruptedException e) {
@ -74,69 +79,14 @@ public class LinuxShell {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
return null; return null;
} }
/*public static boolean isRoot() public static boolean containsIllegals(String toExamine) {
{ // checks for "+" sign so the program doesn't throw an error when its
boolean retval = false; // not erroring.
Process suProcess; Pattern pattern = Pattern.compile("[+]");
Matcher matcher = pattern.matcher(toExamine);
try return matcher.find();
{
suProcess = Runtime.getRuntime().exec("su");
DataOutputStream os =
new DataOutputStream(suProcess.getOutputStream());
DataInputStream osRes =
new DataInputStream(suProcess.getInputStream());
if (null != os && null != osRes)
{
// Getting the id of the current user to check if this is root
os.writeBytes("id\n");
os.flush();
String currUid = osRes.readLine();
boolean exitSu = false;
if (null == currUid)
{
retval = false;
exitSu = false;
Log.e("ROOT", "Can't get root access or denied by user");
} }
else if (true == currUid.contains("uid=0"))
{
retval = true;
exitSu = true;
}
else
{
retval = false;
exitSu = true;
Log.e("ROOT", "Root access rejected: " + currUid);
}
if (exitSu)
{
os.writeBytes("exit\n");
os.flush();
}
}
}
catch (Exception e)
{
// Can't get root !
// Probably broken pipe exception on trying to write to output
// stream after su failed, meaning that the device is not rooted
retval = false;
Log.d("ROOT", "Root access rejected [" +
e.getClass().getName() + "] : " + e.getMessage());
}
return retval;
}*/
} }

View File

@ -80,8 +80,7 @@ public class RootUtils {
} else { } else {
BufferedReader reader = null; //errReader = null; BufferedReader reader = null; //errReader = null;
try { try {
LinuxShell.execute("ls -a " + LinuxShell.getCommandLineString(path));
reader = LinuxShell.execute("IFS='\n';CURDIR='" + LinuxShell.getCmdPath(path) + "';for i in `ls $CURDIR`; do if [ -d $CURDIR/$i ]; then echo \"d $CURDIR/$i\";else echo \"f $CURDIR/$i\"; fi; done");
if (reader == null) if (reader == null)
return null; return null;