当我尝试从我的具有系统权限的程序运行su命令时,我在stderr上返回了此错误:
uid 1000不允许su
我正在为android.uid.system或android.uid.shell设置共享的uid,但它不会改变一件事。设备被假定为root。我真的不明白会发生什么。
以下是代码:
private boolean runAsRoot(String cmd, File workdir) throws IOException {
Log.i(LOG_TAG, "Execute command as root: " + cmd);
Process p = Runtime.getRuntime().exec(new String[] {"su", "-c", cmd});
if (p == null) {
Log.e(LOG_TAG, "cannot create process for " + cmd);
return false;
}
int exit = -1;
try {
exit = p.waitFor();
InputStreamReader isr;
if (exit == 0) {
isr = new InputStreamReader(p.getInputStream());
} else {
isr = new InputStreamReader(p.getErrorStream());
}
BufferedReader br = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
if (sb.length() > 0) {
sb.append('\n');
}
sb.append(line);
}
String string = sb.toString();
Log.l(LOG_TAG, exit == 0 ? Level.INFO : Level.SEVERE, string);
} catch (InterruptedException e) {
Log.e(LOG_TAG, e);
}
return exit == 0;
}
答案 0 :(得分:3)
最简单的方法是建立自己的纳米" sudo"像这样:
<强> sudo.c 强>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[], char *envp[]) {
int i;
int n = 1;
for (i = 1; i < argc; i++) {
n += strlen(argv[i]) + 1;
}
char buf[n + 2];
char* p = buf;
for (i = 1; i < argc; i++) {
strcpy(p, argv[i]);
p += strlen(argv[i]);
*p++ = i == argc - 1 ? 0 : ' ';
}
*p++ = 0;
char* a[] = {"/system/bin/sh", "-c", buf, NULL};
execve("/system/bin/sh", a, envp);
fprintf(stderr, "sudo: /system/bin/sh error:%s\n", strerror(errno));
return 1;
}
编译并安装如下:
<强> make-sudo.sh 强>
export NDK_ROOT=~/<path to android-ndk>
export GCC=$NDK_ROOT/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc
export SYS_ROOT=$NDK_ROOT/platforms/android-17/arch-arm
$GCC --sysroot $SYS_ROOT ./sudo.c -o ./sudo
adb root
adb shell "mount -o rw,remount /system"
adb shell "rm /system/xbin/sudo"
adb push sudo /system/xbin/
adb shell "chmod 06755 /system/xbin/sudo"
adb shell "ls -l /system/xbin/sudo"
adb remount
rm ./sudo
警告: 这是一种简单但危险的方法,因为没有sudoers文件或任何其他黑/白名单允许所有其他应用程序使用sudo。它对我来说很有用,因为我的应用程序是嵌入式Android上唯一的应用程序而且不需要额外的安全性。
答案 1 :(得分:2)
你有一个标准/官方的android'su'程序,它不能用于此目的,而不是像superuser.apk那样被修改为允许这样做的程序。
您不能(从普通的第三方应用)将共享UID设置为特权用户,例如系统,甚至是半特权用户,例如shell。
您的设备可能尚未修改为完全允许root访问。