Выполнить команду с правами суперпользователя в методе JNI в Android

В Java у меня может быть что-то вроде этого:

Process p = Runtime.getRuntime().exec("su");
DataOutputStream pOut = new DataOutputStream(p.getOutputStream());
pOut.writeBytes("find / -perm -2000 -o -perm -4000\n");
pOut.writeBytes("ps\n");
pOut.writeBytes("ls\n");
pOut.writeBytes("exit\n");
pOut.flush();
p.waitFor();

Я знаю, что для выполнения команды find в методе JNI мы можем использовать функцию system или popen. Но я не знаю, как выполнить его с привилегией su?

PS: Поскольку системная функция разветвляет новый дочерний процесс. Я хочу, чтобы один дочерний процесс появлялся для выполнения нескольких команд, как в Java.


person Krypton    schedule 18.09.2012    source источник


Ответы (3)


Ответ Femi близок, я проверил, у меня работает следующее:

system("su -c \"find / -perm -2000 -o -perm -4000; ps; ls\"");
person Community    schedule 18.09.2012

Я не понимаю, какой смысл использовать system() для выполнения, system() не возвращает вам поток для чтения вывода.

Я думаю, вам следует попробовать вместо этого popen()

person Community    schedule 18.09.2012
comment
Спасибо за ваш ответ и ответ Ви Ви. Вы 2 сделали мои дни :) - person Krypton; 18.09.2012

Предполагая, что на вашем Android-устройстве установлено su, и оно находится в пути, вы можете попробовать это следующим образом:

system("su -c \"find / -perm -2000 -o -perm -4000\" root");

su принимает аргументы: аргумент -c указывает команду для запуска.

РЕДАКТИРОВАТЬ: вам может не повезти. Я не уверен, что вы можете передать несколько команд команде su. Вы можете уйти, передав ему оболочку, а затем передав команды этой оболочки, но никаких гарантий нет.

system("su -c \"sh -c 'find / -perm -2000 -o -perm -4000; rm /tmp/1'\" root");
person Femi    schedule 18.09.2012
comment
Пожалуйста, проверьте мое редактирование, так как системная функция создает новый дочерний процесс. Я хочу, чтобы один дочерний процесс появлялся для выполнения нескольких команд, как в Java. - person Krypton; 18.09.2012