Iniciar un script como root a través de ADB


He creado un script para montar particiones y hacer algunas cosas en mi sistema Android. Guardé el guión como install.sh en la carpeta / bin de Android.

Quiero llamar al script desde ADB, que a su vez es llamado desde un archivo por lotes en Windows, pero necesita ser ejecutado como root.

La primera solución que probé fue llamar al script usando

adb shell "su -c sh /bin/script.sh"

Pero no funciona ya que me da un acceso de shell (con permisos de root), pero no se ejecuta nada. También traté de call

adb root "sh /bin/script.sh"

Pero tengo el siguiente error

adbd cannot run as root in production builds

Entonces traté de escribir

su -c "command"

Para todos los comandos que necesitan un acceso root en mi script, pero tengo el mismo problema. Cuando corro el script solo obtengo un shell root y no se ejecuta nada.

Si utilizo la primera solución a mano (por ejemplo, llamo a adb shell su, luego a mi script), funciona. Sin embargo, el punto es automatizar el proceso, para que adb shell pueda ser llamado desde otro script.

Do ¿tienes idea de cómo podría lograr esto ?

Gracias !

Author: ErGo_404, 2012-01-06

6 answers

Esto funciona para mí:

Crear myscript.bat y poner en él (tenga en cuenta las comillas simples alrededor de los comandos que se ejecutarán en modo superusuario):

adb shell "su -c 'command1; command2; command3'"

Luego ejecute myscript.murciélago de una cáscara de DOS.

Nota: no parece que el carácter de continuación de la línea DOS (^) funcione en esta situación. En otras palabras, lo siguiente no funciona para mí:

adb shell "su -c '^
command1; ^
command2; ^
command3'"

Esto resulta en"Error de sintaxis: Cadena entrecomillada sin terminar"

 53
Author: Andy Dennie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-12 20:55:36

Esto funciona:

adb shell echo command which needs root privileges \| su

Si necesita redirección:

adb shell echo 'echo anytext > /data/data/aforbiddenfolder/file' \| su

Para "copiar" un archivo local a una ruta de Android que necesita privilegios de root (pero alocalfile no debe contener '):

cat alocalfile | adb shell echo "echo '`cat`' > /data/data/aforbiddenfolder/file" \| su

Si tienes una mejor manera (incluso para su versiones que no tienen -c), estoy interesado.

 2
Author: rom1v,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-17 13:41:36

Esto funciona para mí:

adb shell "su -c ./data/local/tcpdump-arm -s 0 -v -w /data/local/appxpress_dump.pcap"
 2
Author: thusitha.nuwan12,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-21 09:58:43

Pero no funciona ya que me da un acceso de shell (con permisos de root), pero no se ejecuta nada.

¿Cómo sabes que tienes permisos de root? Supongo que está intentando ejecutar el script en un dispositivo. ¿Su dispositivo ha sido rooteado?

Es posible que necesite dar permisos de ejecución a través de chmod al archivo.

chmod ugo=rwx /bin/script.sh
 0
Author: DavidDraughn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-06 17:52:38

Parece que estaba usando una versión muy simple de su que no aceptaba el argumento-c. Copié otro su que funcionó. AndyD tiene toda la razón, así que estoy aceptando su respuesta en lugar de la mía:)

 0
Author: ErGo_404,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-23 21:49:01

No estoy seguro de si proporcioné una solución o pedí una mejor. Quería ejecutar algunos 200 comando en modo por lotes para ser enviado a adb Seguí este enfoque

    adb shell "su -c command ; "
adb shell "su -c command ; "
adb shell "su -c command ; "
adb shell "su -c command ; "

Y los guardé en un archivo por lotes

Este comando

adb shell "su -c 'command1; command2; command3'"

No funcionará más allá de un cierto tamaño máximo . No funcionó

error: service name too long
 0
Author: user1874594,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-28 04:42:47