2 votos

Ejecutar script usando init.rc no funciona

Estoy tratando de ejecutar un script que se ejecuta cuando el dispositivo ha terminado de arrancar. Este dispositivo en particular no soporta la ejecución de scripts desde un directorio init.d, por lo que estoy usando init.rc.

El archivo init.rc ha sido modificado para incluir el siguiente código

on property:sys.boot_completed=1
start initAsic

service initAsic /data/local/tmp/runn.sh
user root
group root
oneshot

La imagen de arranque ha sido reconstruida y flasheada en el dispositivo. Los cambios se pueden confirmar viendo el archivo init.rc ubicado en /

Actualmente sólo estoy utilizando un simple script (testScript.sh) que emite el siguiente comando

echo hi >> /data/local/tmp/test.txt

El archivo testScript.sh y text.txt tiene 777 y ambos han sido enviados al dispositivo mediante adb push . Su ubicación actual es /data/local/tmp/

Por alguna razón parece que mi script no se está ejecutando, ya que no veo que se escriba ningún texto en test.txt.

¿Me estoy perdiendo algo? ¿Podría ser un problema con SELinux?

Mi dispositivo tiene actualmente SElinux configurado como permisivo. Esto se hizo mediante la alteración del archivo BoardConfig.mk y haciendo una reconstrucción del boot.img.

1 votos

0 votos

Añadir disabled palabra clave para el servicio. Después de reiniciar compruebe el registro: dmesg | grep -C5 initAsic .

0 votos

Disculpas por la respuesta tardía y gracias por tus sugerencias. @alecxs He visto ese post y he replicado la mayoría de los pasos en uno de los procesos descritos, pero no paso a paso - la única diferencia es la ubicación de los archivos que se están ejecutando. No tuve ningún éxito. @IrfanLatif He añadido la palabra clave disabled a los servicios y he ejecutado el comando dmesg. Parece que mi suscpicon era correcto, ya que devuelve service initAsic does not have a SELinux domain defined . Debería ser capaz de resolver el problema ahora - le hará saber cómo voy y publicar una respuesta. Gracias.

1voto

jfbghn Puntos 31

Al ejecutar el comando dmesg | grep -C5 initAsic Vi que me devolvían este código de error

service initAsic does not have a SELinux domain defined

El problema es que tenía que añadir la línea seclabel u:r:init:s0 a mi servicio init ya que es un requisito de init . El servicio completo tiene ahora este aspecto. También se ha añadido la palabra clave "disabled" tal y como sugirió Irfan.

service initAsic2 /data/local/tmp/runn.sh
seclabel u:r:init:s0
user root
group root
oneshot
disabled

También hay que tener en cuenta que SElinux debe estar configurado como permissive para permitir que este servicio se ejecute o, preferiblemente - ya que establecer SElinux como permisivo es un riesgo de seguridad - definir las reglas apropiadas para SElinux y utilizar la política modificada.

Más información sobre el tema aquí: https://Android.stackexchange.com/a/207647/218526

En este post fue donde encontré la sugerencia de añadir la propiedad seclabel. También tiene más información útil sobre el problema de SELinux que estaba encontrando: https://stackoverflow.com/questions/43600261/init-warning-service-myservice-needs-a-selinux-domain-defined-please-fix

1 votos

¿Cuál es el objetivo de añadir seclabel cuando está haciendo que SELinux sea ineficaz al configurarlo permissive ? Desactivar SELinux es un riesgo de seguridad. En su lugar, defina el contexto y/o inyecte reglas SELinux adecuadas. Ver detalles aquí . O al menos utilizar algún contexto permisivo como el de Magisk para su servicio únicamente. Véase mi respuesta a la pregunta marcado como duplicado por @alecxs.

0 votos

Tbh @IrfanLatif no estoy seguro de por qué ha funcionado. Configurar SELinux como permisivo debería haber hecho que no funcionara, pero en mi caso parece que no fue así. Entiendo que es un riesgo de seguridad pero para mis propósitos (prototipos rápidos) está bien. En el futuro planeo definir adecuadamente las reglas de SELinux.

0 votos

Funcionó porque seclabel es un requisito de init que usted cumplió. El punto es, seclabel no sirve de nada cuando SELinux está configurado como permissive . No es más proteger el servicio o cualquier otro archivo/proceso.

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