Como posso executar um script na inicialização? -- boot campo com shell campo com scripts camp android Relacionado O problema

How can I run a script on boot?


54
vote

problema

português

Estou acostumado a executar scripts na inicialização no Linux, mas não sei como fazer isso no Android. Eu gostaria de começar meu daemon ssh no início, então eu sempre serei capaz de me conectar. Como posso executar um script arbitrário na inicialização do Android? Seria preferível fazer isso fora de Dalvik.

Inglês Original

I'm accustomed to running scripts on boot in Linux, but I'm not sure how to do this in Android. I'd like to start my SSH daemon on start, so I'll always be able to connect. How can I run an arbitrary script on Android boot? It'd be preferable to do this outside of Dalvik.

        

Lista de respostas

44
 
vote
vote
Melhor resposta
 

Ao olhar em volta do meu sistema de arquivos Android, descobri que, de fato, ter um diretório /etc/init.d/ . Depois de espreitar lá, encontrei /etc/init.d/20userinit com as 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;    

Este ser, é claro, exatamente O que eu precisava, escrevi o seguinte script no meu computador, em seguida, empurrado para o meu dispositivo:

  #!/system/bin/sh   dropbear -s -g     

(empurrado para o dispositivo via scp userinit.sh phone:/data/local/userinit.sh , mente:])

reinicializou o dispositivo e, em seguida, corrija ps | grep "[d]ropbear" e com certeza, está em execução. Fresco!

 

While looking around my Android filesystem, I found that it did, in fact have a /etc/init.d/ directory. After peeking around in there, I found /etc/init.d/20userinit with the following lines:

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; 

This being, of course, exactly what I needed, I wrote the following script on my computer then pushed it to my device:

#!/system/bin/sh   dropbear -s -g  

(pushed to device via scp userinit.sh phone:/data/local/userinit.sh, mind you :] )

Rebooted the device, then ran ps | grep "[d]ropbear", and sure enough, it's running. Coolness!

 
 
 
 
9
 
vote

/data/init.sh Executa na inicialização, se você tiver root, você pode editá-lo como quiser. Tenha cuidado;)

Edit: Aparentemente, talvez seja necessário colocar o script editado na imagem de inicialização também. Info sobre como fazer isso aqui: http://forum.xda-developers.com/showthread.php? t = 443994

 

/data/init.sh runs at boot, if you have root you can edit it as you like. Be careful ;)

Edit: Apparently you might need to shoehorn the edited script into the boot image as well. Info on how to do that here: http://forum.xda-developers.com/showthread.php?t=443994

 
 
         
         
4
 
vote

Procure para /etc/ diretório. Normalmente, é colocado em ABCDEFGHIJKLMNABCDEFGHIJKLMN8 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"    

Alguns passos acima podem ser substituídos por:

  /etc/init.d/20userinit0   

e depois remontagem RO:

  /etc/init.d/20userinit1   

Agora sua tarefa para encontrar executável ou /etc/init.d/20userinit2 arquivo que você modifica para atingir sua meta:

  /etc/init.d/20userinit3   

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

Bom candidato para incluir scripts personalizados são linhas de:

  /etc/init.d/20userinit4   

Como cada dispositivo exclusivo, você pode precisar fazer o próprio palpite sobre os critérios de pesquisa ...

Por exemplo, encontrei /etc/init.d/20userinit5 que usado por Korn Shell. Eu atualizo este arquivo para estender /etc/init.d/20userinit6 fever e agora cada vez que eu faço /etc/init.d/20userinit7 eu tenho links simpáticos no meu caminho!

ver também maneira difícil (se você não tem sorte com encontrar mago arquivo): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc

 

Look to /etc/ directory. Usually it is placed in /system/ partition which you can mount as 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" 

Some above steps may be replaces with:

$ adb root $ adb remount 

and later remount RO:

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

Now your task to find executable or *rc file which you modify to achieve your goal:

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

Google about each candidate to get know how this file was used.

Good candidate for including custom scripts are lines from:

$ grep service /init*.rc 

As each device unique you may need to do own guess about search criteria...

For example I found /etc/mkshrc which used by Korn shell. I update this file to extend PATH env var and now each time I do adb shell I have Busybox symlinks in my PATH!

See also hard way (if you have no luck with finding magic file): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc

 
 
   
   
1
 
vote

Eu tentei todos esses métodos e nenhum deles funcionou para mim. O que funcionou, no entanto, foi baseado na resposta do Lord-Ralf - Adolf aqui Como executar um script na inicialização em cm12. 1?

Basicamente, encontre o arquivo /etc/init.d/20userinit8 e adicione a seguinte linha no início /etc/init.d/20userinit9

então

  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; 0   

Feito! Agora você pode colocar o que quiser em 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; 1 e será executado na inicialização. Se o arquivo 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; 2 não estiver no seu sistema, esta resposta não funcionará para você. Não se preocupe com a criação.

 

I tried all these methods and none of them worked for me. What worked however was based on lord-ralf-adolf's answer here How to run a script on boot in CM12.1?

basically, find the file /system/etc/install-recovery.sh and add the following line at the beginning /data/init.sh &

then

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

Done! You can now put whatever you want in /data/init.sh and it will run on startup. If the file /system/etc/install-recovery.sh is not in your system then this answer won't work for you. Don't bother creating it.

 
 
   
   
1
 
vote

Se você tiver magisk instalado, você pode colocar o .SH para:

.

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

ou para

.

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

Não se esqueça de torná-lo executável: chmod +x your-script.sh .

Mais informações: https: // github. com / topjohnwu / magisk / blob / mestre / docs / guias.md # boot-scripts

 

If you have magisk installed you can place the .sh to:

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

or to

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

Don't forget to make it executable: chmod +x your-script.sh.

More info: https://github.com/topjohnwu/Magisk/blob/master/docs/guides.md#boot-scripts

 
 
1
 
vote

As coisas eram simples antes do Android 5 quando o Selinux não foi enforcing . Você pode colocar seu código em qualquer script ou substituir um binário por script que foi executado com privilégios de raiz na inicialização. Outro método foi para definir um serviço de ABCDEFGHIJKLMNABCDEFGHIJKLMN2 Especificamente para Lote Execute Scripts de algum diretório.

Com base nessas abordagens Custom ROM desenvolvedores introduzidos diferentes pseudo- abcdefghijklmn4 fenômeno como /etc/init.d/ , /etc/install-recovery.sh , < code> /etc/init.qcom.post_boot.sh , /system/bin/debuggerd , /data/init.sh , /data/local/userinit.sh , enforcing0 etc.

No entanto, um processo em execução com o UID enforcing1 mas em um contexto restrito do SELinux é bastante indefeso. Um serviço iniciado em enforcing2 arquivo com enforcing3 contexto não pode se executar Um script de shell de enforcing4 , portanto, a política do Selinux precisa ser corrigida para injetar um contexto, por exemplo, Magisk define enforcing5 . Depois disso, é possível executar um script diretamente como enforcing6 serviço ou de enforcing7 -like o diretório.

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

 

Things were simple before Android 5 when SELinux wasn't enforcing. You could put your code in any script or replace a binary with script which was executed with root privileges on boot. Another method was to define a custom init service specifically to batch execute scripts from some directory.

Based on these approaches custom ROM developers introduced different pseudo-init.d phenomenon like /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.

However a process running with UID 0 but in a restricted SELinux context is quite helpless. A service started in init.rc file with u:r:init:s0 context can't even execute a shell script from /system/bin/, so SELinux policy needs to be patched to inject an unrestricted context e.g. Magisk defines u:r:magisk:s0. After that it's possible to run a script directly as init service or from init.d-like directory.

For details see How to run an executable on boot and keep it running?

 
 
0
 
vote

maneira simples (trabalho):

    .
  1. Prepare seus comandos post boot em um script, digite / System / Xbin / Post-boot (Set Exec Perm)

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

por exemplo:

ECHO / SYSTEM / XBIN / POST-boot & gt; & gt; /system/etc/init.qcom.post_boot.sh

Feito!

(se você não consegue encontrar os dispositivos QCOM Post_Boot (Qualcomm), procure qualquer scripts post_boot)

 

Simple way (working):

  1. Prepare your post boot commands in a script, say /system/xbin/post-boot (set exec perm)

  2. Add the above custom script path at the end of /system/etc/init.qcom.post_boot.sh

Eg:

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

Done!

(If you can't find the qcom post_boot (Qualcomm devices), look for any post_boot scripts)

 
 

Perguntas relacionadas

1  Como criar um arquivo update.zip que pode copiar e renomear um arquivo?  ( How to create an update zip file that can copy rename a file ) 
Aqui está exatamente o que estou procurando - eu preciso de um arquivo 'update.zip' que pode copiar um arquivo (exemplo): /system/framework/file-to-copy.apk...

1  Como definir a frequência da CPU o mais cedo possível?  ( How to set cpu frequency as early as possible ) 
O que quero dizer com esta questão é a sequência de execução de scripts no momento da inicialização. Suponha que eu tenha esta linha de script: echo 3070...

1  Como pressionar LONGO no Android 4.1.2 e 4.2.2 usando ADB?  ( How to long press in android 4 1 2 and 4 2 2 using adb ) 
Eu descobri que o comando abaixo não é executado no Android 4.1.2 e 4.2.2, mas é executado do Android 4.4 +. input touchscreen swipe x1 y1 x2 y2 [duration]...

0  Como executar um script em um dispositivo Android enraizado?  ( How to run a script on a rooted android device ) 
Recentemente, implantamos muitos dispositivos Android internamente para exibir apenas a página da Web personalizada. dispositivo: rkm mk902 OS: Android 4...

3  Executando seu próprio script .SH em Vold.Decrypt = Trigger_shutdown_Framework via init.rc (Android 5.0)  ( Running your own sh script at vold decrypt trigger shutdown framework via init ) 
Eu quero solucionar um bug do fornecedor em um telefone Android 5.0 (Chinês, MTK, sem fonte adequada) O problema é devido a um bug em alguns binários, / dad...

2  Como faço para script meu telefone?  ( How do i script my phone ) 
O que eu principalmente quero fazer, é rapidamente alterar configurações, adicionar alarmes etc. talvez seja chamado de outra coisa? Isso é de um PC Windo...

0  Onde estão os binários instalados?  ( Where are binaries installed ) 
Eu recentemente enraizei meu telefone para poder instalar o SL4A. Eu quero executar alguns comandos através de um script Python, desligue especificamente o Go...

9  No Android, posso escrever scripts (semelhantes aos arquivos .bat .bat) para combinar vários comandos de linha de comando?  ( On android can i write scripts similar to win bat files to combine several co ) 
No Windows, posso executar dois comandos usando um arquivo .bat. Como posso alcançar a mesma coisa no Android Por exemplo: . Atualize meus podcasts chama...

3  Como executar um executável na inicialização e mantê-lo em execução?  ( How to run an executable on boot and keep it running ) 
Eu tenho uma compilação executável a partir de um programa ndk-build . Eu quero executá-lo em um dispositivo Android enraizado. Quanto é a possibilidade de o...

54  Como posso executar um script na inicialização?  ( How can i run a script on boot ) 
Estou acostumado a executar scripts na inicialização no Linux, mas não sei como fazer isso no Android. Eu gostaria de começar meu daemon ssh no início, então ...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.