67 votos

¿Cómo puedo ejecutar un script al arrancar?

Estoy acostumbrado a ejecutar scripts al iniciar en Linux, pero no estoy seguro de cómo hacerlo en Android. Me gustaría iniciar mi demonio SSH al arrancar, para poder conectarme siempre. ¿Cómo puedo ejecutar un script arbitrario al arrancar en Android? Sería preferible hacerlo fuera de Dalvik.

51voto

mjlee Puntos 949

Mientras exploraba mi sistema de archivos de Android, encontré que de hecho tenía un directorio /etc/init.d/. Después de echar un vistazo allí, encontré /etc/init.d/20userinit con las siguientes líneas:

if [ -e /data/local/userinit.sh ];
then 
    log -p -i -t userinit "Ejecutando /data/local/userinit.sh";
    busybox chmod +x /data/local/userinit.sh;
    logwrapper /system/bin/sh /data/local/userinit.sh;
    setprop cm.userinit.active 1;
fi;

Siendo, por supuesto, exactamente lo que necesitaba, escribí el siguiente script en mi computadora y luego lo envié a mi dispositivo:

#!/system/bin/sh 

dropbear -s -g 

(enviado al dispositivo vía scp userinit.sh phone:/data/local/userinit.sh, ¡por cierto :] )

Reinicié el dispositivo, luego ejecuté ps | grep "[d]ropbear", ¡y efectivamente, está funcionando! ¡Genial!

0 votos

Los comentarios no son para discusiones extendidas; esta conversación ha sido trasladada al chat.

0 votos

Parece que LineageOS viene con un 90userinit exactamente así. ¡Muchas gracias por la pista!

2 votos

10voto

Matthew Read Puntos 35808

/data/init.sh se ejecuta en el arranque, si tienes permisos de root puedes editarlo como quieras. ¡Ten cuidado ;)

Editar: Aparentemente también puede que necesites incluir el script editado en la imagen de arranque. Información sobre cómo hacerlo aquí: http://forum.xda-developers.com/showthread.php?t=443994

1 votos

Sí, no puedo encontrar este archivo en mi Nexus One con CM7-RC1. Veré si un find / -name "init.sh" encuentra algo. ¿Hay otros scripts que se ejecuten al arrancar?

1 votos

Deberías tener un /etc/init.rc que inicie la terminal. Debería llamar a init.sh pero si no lo hace, simplemente puedes hacer que llame a tu propio script.

0 votos

Lamentablemente, tampoco tengo ese script, pero encontré una solución.

8voto

Daniel Dolz Puntos 1443

Si tienes Magisk instalado, puedes colocar el archivo .sh en:

/sbin/.magisk/img/.core/service.d/

o en

/sbin/.magisk/img/.core/post-fs-data.d/

No olvides hacerlo ejecutable: chmod +x tu-script.sh.

Más información: https://github.com/topjohnwu/Magisk/blob/master/docs/guides.md#boot-scripts

1 votos

Respuesta mejor hasta ahora 2021

6voto

gavenkoa Puntos 111

Mira en el directorio /etc/. Normalmente está ubicado en la partición /system/ que puedes montar como RW:

$ ls -l /etc
lrwxrwxrwx 1 root root 11 Jan 1  2009 /etc -> /system/etc
$ su
$ mount -o remount,rw /system
$ chmod o+w /system/etc  # para "adb push"

Algunos de los pasos anteriores pueden ser reemplazados con:

$ adb root
$ adb remount

y luego volver a montar como RO:

$ chmod o-w /system/etc
$ mount -o remount,ro /system

Ahora tu tarea es encontrar un archivo ejecutable o *rc que puedas modificar para lograr tu objetivo:

$ find /etc -type f -perm +110
$ find /etc -name "*rc"
$ find /etc -name "init*"
$ grep -R /data /etc
$ grep -R /system /etc

Investiga sobre cada candidato para saber cómo se usó ese archivo.

Un buen candidato para incluir scripts personalizados son las líneas de:

$ grep service /init*.rc

Como cada dispositivo es único, es posible que necesites hacer tus propias suposiciones sobre los criterios de búsqueda...

Por ejemplo, encontré /etc/mkshrc que es usado por el shell Korn. ¡Actualicé este archivo para ampliar la variable de entorno PATH y ahora cada vez que ejecuto adb shell tengo enlaces simbólicos de Busybox en mi PATH!

Ver también manera difícil (si no tienes suerte encontrando el archivo mágico): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc

0 votos

Pero ¿no se está sobrescribiendo en cada arranque? Creo que la carpeta /etc forma parte del cpio que es un ramdisk.

1 votos

@ransh esto no es así al menos en: 8.1.0_r60 donde /system es system.img, y /etc es un enlace simbólico en /system.

0 votos

Descubrí que incluso después de eliminar un archivo de /system no pude volver a colocarlo (el mismo archivo) debido a que "no hay espacio disponible en el dispositivo". Por supuesto, la imagen del sistema tiene el tamaño exacto que necesita pero no sé por qué al eliminar el archivo no se liberó su espacio. (No fue por el tema de los descriptores de archivo abiertos.)

4voto

dampier Puntos 1308

He probado todos estos métodos y ninguno ha funcionado para mí. Lo que funcionó, sin embargo, se basó en la respuesta de lord-ralf-adolf aquí ¿Cómo ejecutar un script al arrancar en CM12.1?

Básicamente, encuentra el archivo /system/etc/install-recovery.sh y agrega la siguiente línea al principio /data/init.sh &

luego

touch /data/init.sh
chmod 755 /data/init.sh

¡Listo! Ahora puedes poner lo que quieras en /data/init.sh y se ejecutará al iniciar. Si el archivo /system/etc/install-recovery.sh no está en tu sistema, entonces esta respuesta no funcionará para ti. No te molestes en crearlo.

4 votos

En realidad, tengo un sistema donde /system/etc/install-recovery.sh no estaba presente, pero se ejecuta de todos modos en el arranque si está presente, por lo que vale la pena verificarlo.

1 votos

Esta es la única cosa que funcionó con Android 9.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X