Como posso executar um script na inicialização?

51

Estou acostumado a executar scripts na inicialização no Linux, mas não sei como fazer isso no Android. Gostaria de iniciar meu daemon SSH no início, para poder sempre me conectar. Como posso executar um script arbitrário na inicialização do Android? Seria preferível fazer isso fora de Dalvik.

Naftuli Kay
fonte

Respostas:

42

Ao olhar em volta do meu sistema de arquivos Android, descobri que ele realmente tinha um /etc/init.d/diretório. Depois de espreitar por aí, encontrei /etc/init.d/20userinitas seguintes linhas:

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;

Sendo este, é claro, exatamente o que eu precisava, escrevi o seguinte script no meu computador e o enviei ao meu dispositivo:

#!/system/bin/sh 

dropbear -s -g 

(enviado para o dispositivo via scp userinit.sh phone:/data/local/userinit.sh, lembre-se:])

Reinicie o dispositivo, depois execute ps | grep "[d]ropbear"e, com certeza, está em execução. Frieza!

Naftuli Kay
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Firelord
9

/data/init.shé executado na inicialização, se você tiver root, poderá editá-lo como quiser. Seja cuidadoso ;)

Editar: Aparentemente, talvez você precise calçar o script editado na imagem de inicialização também. Informações sobre como fazer isso aqui: http://forum.xda-developers.com/showthread.php?t=443994

Matthew Read
fonte
11
Sim, não consigo encontrar esse arquivo no meu Nexus One executando o CM7-RC1. Vou ver se find / -name "init.sh"algo aparece. Existem outros scripts executados na inicialização?
Naftuli Kay
11
Você deve ter um /etc/init.rcque inicie o shell. Ele deve chamar init.sh, mas se não, você pode simplesmente chamar seu próprio script.
Matthew Leia
Infelizmente, também não tenho esse script, mas encontrei uma solução.
Naftuli Kay
3
Qual é a versão do Android? 4.3 tem /datamas não /data/init/.shou /etc/init.rc. O Grep não encontra nenhuma instância interessante da string initem /etc(mesmo recursiva).
Stéphane Gourichon
Você tem alguma idéia de como adicionar um script de inicialização ao criar o AOSP?
Saleh
4

Olhe para o /etc/diretório. Geralmente é colocado em uma /system/partição que você pode 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"

Algumas etapas acima podem ser substituídas por:

$ adb root
$ adb remount

e depois remontar o RO:

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

Agora, sua tarefa de encontrar executável ou *rcarquivo que você modifica para atingir seu objetivo:

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

Google sobre cada candidato para saber como esse arquivo foi usado.

Um bom candidato para incluir scripts personalizados são as linhas de:

$ grep service /init*.rc

Como cada dispositivo é único, pode ser necessário adivinhar os critérios de pesquisa ...

Por exemplo, descobri /etc/mkshrcqual usado pelo shell Korn. Eu atualizo este arquivo para estender PATHenv var e agora, toda vez que adb shelltenho, tenho links simbólicos do Busybox no meu PATH!

Veja também o caminho difícil (se você não tiver sorte em encontrar o arquivo mágico ): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc

gavenkoa
fonte
Mas não está sendo superado a cada inicialização? Eu acho que a pasta / etc faz parte do cpio, que é ramdisk.
Ransh
11
@ransh, esse não é o caso, pelo menos em: 8.1.0_r60 onde /systemestá system.imge /etcé um link simbólico para /system.
Ciro Santilli adicionou
1

Eu tentei todos esses métodos e nenhum deles funcionou para mim. O que funcionou, no entanto, foi baseado na resposta de lord-ralf-adolf aqui Como executar um script de inicialização no CM12.1?

basicamente, encontre o arquivo /system/etc/install-recovery.she adicione a seguinte linha no início /data/init.sh &

então

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

Feito! Agora você pode colocar o que quiser /data/init.she ele será executado na inicialização. Se o arquivo /system/etc/install-recovery.shnão estiver no seu sistema, esta resposta não funcionará para você. Não se preocupe em criá-lo.

Ramast
fonte
11
Na verdade, eu tenho um sistema onde /system/etc/install-recovery.shnão estava presente, mas ele ainda é executado na inicialização, se presente, então vale a pena conferir.
jcaron
1

As coisas eram simples antes do Android 5, quando o SELinux não era enforcing. Você pode colocar seu código em qualquer script ou substituir um binário por script que foi executado com privilégios de root na inicialização. Outro método foi definir um initserviço personalizado especificamente para executar scripts em lote de algum diretório.

Baseado nessas abordagens desenvolvedores ROM personalizado introduzidas diferente pseudo-init.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.

No entanto, um processo em execução com o UID, 0mas em um contexto restrito do SELinux, é bastante impotente. Um serviço começou em init.rcarquivo com u:r:init:s0contexto não pode mesmo executar um script shell a partir /system/bin/, por isso as necessidades da política SELinux para ser corrigido para injetar um irrestrito contexto por exemplo Magisk define u:r:magisk:s0 . Depois disso, é possível executar um script diretamente como initserviço ou no init.ddiretório -like.

Para obter detalhes, consulte Como executar um executável na inicialização e mantê-lo em execução?

Irfan Latif
fonte
0

Maneira simples (trabalhando):

  1. Prepare seus comandos pós-inicialização em um script, diga / system / xbin / post-boot (set exec perm)

  2. Adicione o caminho do script personalizado acima no final de /system/etc/init.qcom.post_boot.sh

Por exemplo:

echo / system / xbin / pós-inicialização >> /system/etc/init.qcom.post_boot.sh

Feito!

(Se você não conseguir encontrar o qcom post_boot (dispositivos Qualcomm), procure por scripts post_boot)

Seff
fonte