¿Cómo puedo ejecutar un script en el arranque?

51

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 inicio, por lo que siempre podré conectarme. ¿Cómo puedo ejecutar un script arbitrario en el arranque de Android? Sería preferible hacer esto fuera de Dalvik.

Naftuli Kay
fuente

Respuestas:

42

Mientras miraba mi sistema de archivos de Android, descubrí que sí, de hecho, tenía un /etc/init.d/directorio. Después de mirar por allí, encontré /etc/init.d/20userinitlas 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;

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

#!/system/bin/sh 

dropbear -s -g 

(empujado al dispositivo a través scp userinit.sh phone:/data/local/userinit.sh, ten en cuenta:])

Reinició el dispositivo, luego se ejecutó ps | grep "[d]ropbear"y, efectivamente, se está ejecutando. ¡Frescura!

Naftuli Kay
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Señor del fuego
9

/data/init.shse ejecuta en el arranque, si tienes root puedes editarlo como quieras. Ten cuidado ;)

Editar: Aparentemente, es posible que también necesite calzar el guión editado en la imagen de arranque. Información sobre cómo hacerlo aquí: http://forum.xda-developers.com/showthread.php?t=443994

Matthew Read
fuente
1
Sí, parece que no puedo encontrar este archivo en mi Nexus One con CM7-RC1. Veré si find / -name "init.sh"aparece algo. ¿Hay otros scripts que se ejecutan en el arranque?
Naftuli Kay
1
Deberías tener un /etc/init.rcque inicie el shell. Debería llamar a init.sh, pero si no lo hace, puede hacer que llame a su propio script.
Matthew leyó el
Desafortunadamente, tampoco tengo ese script, pero encontré una solución.
Naftuli Kay
3
¿Qué versión de Android es? 4.3 tiene /datapero no /data/init/.sho /etc/init.rc. Grep no encuentra ninguna instancia interesante de la cadena initen /etc(incluso recursiva).
Stéphane Gourichon
¿Tienes alguna idea de cómo agregar un script de inicio al construir AOSP?
Saleh
4

Mira al /etc/directorio. Por lo general, se coloca en una /system/partición que puede 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"

Algunos pasos anteriores pueden reemplazarse con:

$ adb root
$ adb remount

y luego volver a montar RO:

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

Ahora su tarea de encontrar el archivo ejecutable o el *rcarchivo que modifica para lograr su objetivo:

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

Google acerca de cada candidato para saber cómo se utilizó este archivo.

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

$ grep service /init*.rc

Como cada dispositivo es único, es posible que deba adivinar los criterios de búsqueda ...

Por ejemplo, encontré el /etc/mkshrcque usaba Korn shell. Actualizo este archivo para extender PATHenv var y ahora cada vez que lo hago adb shell¡tengo enlaces simbólicos de Busybox en mi RUTA!

Vea también de manera difícil (si no tiene suerte con la búsqueda del archivo mágico ): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc

gavenkoa
fuente
¿Pero no se anula cada arranque? Creo que la carpeta / etc es parte de cpio, que es ramdisk.
ransh
1
@ransh este no es el caso al menos en: 8.1.0_r60 donde /systemestá system.img, y /etces un enlace simbólico en /system.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1

Probé todos estos métodos y ninguno de ellos funcionó para mí. 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, encuentre el archivo /system/etc/install-recovery.shy agregue la siguiente línea al principio /data/init.sh &

entonces

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

¡Hecho! Ahora puede poner lo que quiera /data/init.shy se ejecutará al inicio. Si el archivo /system/etc/install-recovery.shno está en su sistema, esta respuesta no funcionará para usted. No te molestes en crearlo.

Ramast
fuente
1
En realidad, tengo un sistema donde /system/etc/install-recovery.shno estaba presente, pero todavía se ejecuta en el arranque si está presente, por lo que vale la pena verificarlo.
jcaron
1

Las cosas eran simples antes de Android 5 cuando SELinux no lo era enforcing. Puede poner su código en cualquier script o reemplazar un binario con script que se ejecutó con privilegios de root en el arranque. Otro método fue definir un initservicio personalizado específicamente para ejecutar scripts de ejecución por lotes desde algún directorio.

Sobre la base de estos enfoques desarrolladores ROM personalizada introducido diferentes pseudoinit.d fenómeno como /etc/init.d/, /etc/install-recovery.sh, /etc/init.qcom.post_boot.sh, /system/bin/debuggerd, /data/init.sh, /data/local/userinit.sh, /data/local/init.d/etc.

Sin embargo, un proceso que se ejecuta con UID 0pero en un contexto restringido de SELinux es bastante inútil. Un servicio iniciado en init.rclos archivos de u:r:init:s0contexto ni siquiera puede ejecutar un script de shell desde /system/bin/, por lo que las necesidades de políticas de SELinux a ser parcheado para inyectar una irrestricta contexto por ejemplo magisk define u:r:magisk:s0 . Después de eso, es posible ejecutar un script directamente como initservicio o desde un init.ddirectorio similar.

Para obtener más información, consulte ¿Cómo ejecutar un ejecutable en el arranque y mantenerlo ejecutándose?

Irfan Latif
fuente
0

Manera simple (trabajando):

  1. Prepare sus comandos posteriores al inicio en un script, digamos / system / xbin / post-boot (establezca la permanente exec)

  2. Agregue la ruta de script personalizada anterior al final de /system/etc/init.qcom.post_boot.sh

P.ej:

echo / system / xbin / post-boot >> /system/etc/init.qcom.post_boot.sh

¡Hecho!

(Si no puede encontrar el qcom post_boot (dispositivos Qualcomm), busque los scripts post_boot)

Seff
fuente