67 votos

¿Cómo puedo ejecutar un guión en el arranque?

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

51voto

mjlee Puntos 949

Mientras buscaba en mi sistema de archivos de Android, encontré que sí, de hecho tiene un /etc/init.d/ directorio. Después de mirar por ahí, encontré /etc/init.d/20userinit con las siguientes líneas:

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

Este ser, por supuesto, exactamente lo que necesitaba, escribí el siguiente guión en mi ordenador y luego lo empujé a mi dispositivo:

#!/system/bin/sh 

dropbear -s -g 

(empujado al dispositivo a través de scp userinit.sh phone:/data/local/userinit.sh pero no te preocupes ] )

Reinició el dispositivo, y luego corrió ps | grep "[d]ropbear" y, por supuesto, está funcionando. ¡Genial!

0 votos

Los comentarios no son para ampliar la discusión; esta conversación ha sido trasladado 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 Root puedes editarlo como quieras. Ten cuidado ;)

Editar: Aparentemente podrías necesitar meter el guión editado en la imagen de arranque también. Información sobre cómo hacer eso aquí: http://forum.xda-developers.com/showthread.php?t=443994

1 votos

Sí, parece que no puedo encontrar este archivo en mi Nexus One corriendo CM7-RC1. Voy a ver si un find / -name "init.sh" aparece algo. ¿Hay otros scripts que se ejecuten en el arranque?

1 votos

Debería tener un /etc/init.rc que inicia el shell. Debería llamar a init.sh pero si no lo hace 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 tiene magisk instalado puedes colocar el .sh a:

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

o a

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

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

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

1 votos

Mejor respuesta por ahora 2021

6voto

gavenkoa Puntos 111

Mira a /etc/ directorio. Normalmente se coloca en /system/ partición 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  # for "adb push"

y más tarde volver a montar el RO:

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

Ahora su tarea de encontrar ejecutables o *rc que modificas 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

Busca en Google cada candidato para saber cómo se usó este archivo.

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

$ grep service /init*.rc

Como cada dispositivo es único, puede que tengas que hacer tus propias conjeturas sobre los criterios de búsqueda...

Por ejemplo, encontré /etc/mkshrc que usó Korn Shell. Actualizo este archivo para ampliar PATH env var y ahora cada vez que lo hago adb shell ¡Tengo symlinks de Busybox en mi PATH!

Ver también de manera difícil (si no tienes suerte de encontrar magia archivo): http://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc

0 votos

¿Pero no se anula en cada arranque? Creo que la carpeta /etc es parte de cpio que es ramdisk.

1 votos

@ransh este no es el caso al menos en: 8.1.0_r60 donde /system es system.img y /etc es un enlace simbólico a /system .

0 votos

He descubierto que incluso después de borrar un archivo de /system No he podido volver a ponerlo (el mismo archivo) porque "no queda espacio en el dispositivo". Por supuesto que la imagen del sistema tiene el tamaño exacto que necesita, pero no sé por qué al borrar el archivo no se liberaba su espacio. (No era lo de los descriptores de archivo abiertos).

4voto

dampier Puntos 1308

He probado todos estos métodos y ninguno me ha funcionado. Sin embargo, lo que funcionó se basó en la respuesta de lord-ralf-adolf aquí ¿Cómo ejecutar un script en el arranque en CM12.1?

básicamente, encontrar el archivo /system/etc/install-recovery.sh y añadir la siguiente línea al principio /data/init.sh &

entonces

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

Ya está. Ahora puedes poner lo que quieras en /data/init.sh y se ejecutará al inicio. Si el archivo /system/etc/install-recovery.sh no está en su sistema, entonces esta respuesta no le servirá. No te molestes en crearla.

4 votos

En realidad, tengo un sistema en el que /system/etc/install-recovery.sh no estaba presente, pero todavía se ejecuta en el arranque si está presente, así que vale la pena comprobarlo.

1 votos

Esto es lo único que ha funcionado 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