如何在启动时运行脚本? -- boot 领域 和 shell 领域 和 scripts 领域 android 相关 的问题

How can I run a script on boot?


54
vote

问题

中文

我习惯于在Linux的启动时运行脚本,但我不确定如何在Android中执行此操作。我想在开始时开始我的SSH守护程序,所以我将永远能够连接。如何在Android启动时运行任意脚本?在dalvik之外做这一点是优选的。

英文原文

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.

        

回答列表

44
 
vote
vote
最佳答案
 

在查看我的android文件系统时,我发现它确实有一个 /etc/init.d/ 目录。在那里偷看之后,我找到了 /etc/init.d/20userinit ,下行:

  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;   

当然,完全我需要的是什么,我在我的计算机上写下以下脚本然后将其推到我的设备:

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

(通过 scp userinit.sh phone:/data/local/userinit.sh ,mind为您:])

重新启动设备,然后ran ps | grep "[d]ropbear" ,并熟悉它正在运行。凉爽!

 

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 在引导时运行,如果您有root,您可以根据您的喜好编辑它。小心;)

编辑:显然您也需要将已编辑的脚本蒙塞还是靴子映像。关于如何在此处执行以下操作: 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

查看 /etc/ 目录。通常它被放置在 /system/ 分区中,您可以安装为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"   

一些上述步骤可以用:

替换
  /etc/init.d/20userinit0  

及以后重新安装RO:

  /etc/init.d/20userinit1  

现在您的任务查找可执行文件或 /etc/init.d/20userinit2 文件,您修改以实现目标:

  /etc/init.d/20userinit3  

谷歌关于每个候选人来了解这个文件的使用方式。

包括自定义脚本的好候选者是来自:

的行
  /etc/init.d/20userinit4  

每个设备都是唯一的,您可能需要自己猜测搜索条件...

例如,我找到了korn shell使用的code> /etc/init.d/20userinit5 。我更新此文件以扩展 /etc/init.d/20userinit6 env var,现在我每次做 /etc/init.d/20userinit7 我有我的路径中的busybox symlinks!

另请参见 stract方式(如果您没有找到finding magic 文件): 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

我尝试了所有这些方法,都没有为我工作。 然而,这是基于Lord-Ralf-Adolf的答案的原因 如何在cm12中启动启动脚本。 1?

基本上,找到文件 /etc/init.d/20userinit8 并在开头添加以下行 /etc/init.d/20userinit9

然后

  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  

完成! 您现在可以在 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 中放入您想要的任何内容,它将在启动时运行。 如果文件 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 不在系统中,则此答案将为您提供。不要打扰创造它。

 

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

如果您有 magisk 安装,您可以将.sh放入:

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

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

别忘了使它可执行: chmod +x your-script.sh

更多信息: https:// github。 com / topjohnwu / magisk / blob / master / docs / guides.md#引导脚本

 

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

当SELinux不是 ABCDEFGHIJKLMNABCDEFGHIJKLMN1 时,在Android 5之前简单您可以将代码放在任何脚本中,或用脚本替换二进制文件,该脚本是在引导上使用root权限执行的。另一种方法是定义自定义 init 服务,专门从某个目录中批量执行脚本。

基于这些方法,自定义ROM开发人员引入不同的 init.d 现象如 abcdefghijklmnabcdefghijklmn /etc/install-recovery.sh ,<代码> ABCDEFGHIJKLMNABCDEFGHIJKLMN6 , ABCDEFGHIJKLMNABCDEFGHIJKLMN7 ABCDEFGHIJKLMNABCDEFGHIJKLMN8 ABCDEFGHIJKLMNABCDEFGHIJKLMN9 ,<代码> ABCDEFGHIJKLMNABCDEFGHIJKLMN10 等。 但是,使用UID enforcing1 但是在受限制的selinux上下文中的进程非常无助。在 enforcing2 文件中启动了服务,其中包含 enforcing3 上下文甚至无法执行shell脚本来自 enforcing4 ,所以需要修补selinux策略以注入不受限制的上下文magisk 定义 enforcing5 。之后,可以直接运行脚本作为 enforcing6 服务或从 enforcing7 -like目录。

有关详细信息,请参阅如何在启动时运行可执行文件并将其保持运行?

 

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

简单的方式(工作):

  1. 在脚本中准备好发布命令,例如/ system / xbin / post-boot(set exec perm)

  2. 在/system/etc/init.qcom.post_boot.sh

  3. 的末尾添加上面的自定义脚本路径

EG:

回声/系统/ xbin /后启动&gt;&gt; /system/etc/init.qcom.post_boot.sh

完成!

(如果找不到qcom post_boot(Qualcomm设备),请查找任何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)

 
 

相关问题

1  如何在初创版中运行一个应用程序  ( How to run an app on startup in background ) 
如何在背景中运行一个应用程序?例如GlassWire,卡巴斯基在启动中运行,以及在通知栏托盘中的顶部显示。我想在启动时在背景中运行GOM音频;自动出现在托盘中。 ...

4  G1无法超过Android启动徽标  ( G1 unable to get past android boot logo ) 
我有一个t-mobile g1(htc梦想),今天早上它振动一次然后重新启动,然后它去了Android引导徽标通过它并停止在黑屏上。 我已经尝试拉动电池并重新启动,但它具有相同的问题。 手机rooted,但它没有自定义启动屏幕,引导加载程序,ROM。它具有除了使用root的能力之外的一切。 运行Android 1.6...

1  如何尽早设置CPU频率?  ( How to set cpu frequency as early as possible ) 
这个问题的意思是在引导时执行脚本的序列。 假设我有这个脚本: echo 307000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq 我希望尽快执行此行脚本(甚至在加载Android shell之前)。把它放在哪里最好的地方? ( init.d...

4  我的Android设备是否启动到“隐身”分区?  ( Is my android device booting into a stealth partition ) 
好的,这是一个奇怪的问题我遇到了一个我在几年内没有问题的Android系统遇到过......而且我几乎没有关于如何潜在修复它的想法。 让我们从一开始就描述问题以及我过去12个小时的尝试。 我今天早上醒来,今天早上看到最近安装的应用程序(通过Google Play商店)已经崩溃了,而且显然是其他应用程序和服务的卡车也展...

2  Android 2.2 - 如何查看在启动时运行的应用程序[复制]  ( Android 2 2 how to see applications that run at start up ) 
这个问题已经在这里有答案: 关闭 10年前。 可能的重复: 如何阻止应用程序在启动时运行? 你好! 是否有可能看到在启动时运行的应用程序? 例如,雅虎的白痴制作了Android Messen...

0  如何在A / B分区设备中挂载userdata_b?  ( How to mount userdata b in stot a in a b partition device ) 
我有一个天梭(mi a1),通过分离Vendor_A,Vendor_B,UserData_A,UserData_B来引导TWRP双重启动。它是Cosmicdan的TWRP与复活混音(SLOT_A)官方和DOTOS官方(SLOT_B)引导的双重启动。我想在复活混音或副verse中安装userdata_b。 我已经没有结...

36  adb可以发现设备但不是fastboot  ( Adb can discover devices but not fastboot ) 
我在网上搜索了这个问题,它通常通过安装相应的驱动程序来解决。问题是我在Mac上。 当我插入我的设备时,可以在我运行 adb devices 时发现它。我运行 adb reload bootloader ,它进入下载模式(当上电时按住音量+主按钮的模式)。这样对吗?我认为是。 无论如何,当它在这个阶段时, adb de...

5  启动Services [重复]  ( Start services at boot ) 
这个问题已经在这里有一个答案: 打开启动/启动后的应用程序 (1答) 关闭...

1  连接电源连接时平板电脑如何自动开机?  ( How does a tablet automatically power on when a power source is connected ) 
请想象一下您有Android平板电脑的汽车情况: http://content.worldcarfans.co/2014 /11/24/thumbnails/24486128385597.hl2.jpg 和以下工作规则(大多数情况下预期): 如果汽车是关闭,平板电脑是关闭; 如果汽车是,平板电脑是(自动)...

0  充电时电源电源,但仅当电池电量大于20%时  ( Power on when charging but only when battery level is greater than 20 ) 
我最近试图将平板电脑适合我的车,我遇到了一个问题醒来了 不使用电源按钮。 我的解决方案是在充电时启动设备,但是 我注意到,当电池电量为0%时,设备靴子然后立即关闭。 我使用这个adb选项来触发此行为: fastboot oem off-mode-charge 0 但是,这使得这款手机在没有检查电池水平...

0  Android由于系统/ app文件夹中缺少APK文件而无法启动  ( Android does not boot because of missing apk files in system app folder ) 
我从 https://stackoverflow.com/q/15872848/1665807 我有一个rooted huawei u8825d phone.i想知道"/ system / app /" 文件夹中没有apk文件。 所以,我从/ system / app /到内部sd卡移动了这些apk文件。当我...

4  Android恢复Bootstrap NANDROID备份失败后的ROM闪存  ( Android restore bootstrap nandroid backup after a failed rom flash ) 
我试图将我的droid x2闪存到cm7,但它失败了。在我尝试Flash之前,我使用名为"System Recovery" 的应用程序进行了NAND​​ROID备份(Motodx2_bootstrap_sign.apk)。 我想还原到该备份,但我似乎无法启动到相同的恢复菜单中。 有人请帮帮我。我的手机到达启动动画...

3  蜂窝中的长靴时间  ( Long boot time in honeycomb ) 
我刚刚得到了一个摩托罗拉xoom,到目前为止,爱我,但我惊讶的是,设备的初始启动需要这么长时间(大约1分钟)。我用较少的公共汽车比我的电脑少,一个较少的"蜂窝旋" 操作系统(蜂窝vs win 7),以及一个稳固状态硬盘的好处,xoom应该能够从ooft向上启动20秒。 有谁知道蜂窝中的启动时间的方法?谢谢! ...

2  当100%充电时,三星Galaxy S卡在启动循环中  ( Samsung galaxy s stuck in boot loop when 100 charged ) 
在我们开始之前,我应该提到我没有以任何方式搞定固件。但似乎只要我把它放在充电并且它达到100%容量上,我就会打开它,它被卡在启动循环中。我已经关闭了它,而且它还没有收费,它的工作正常。 这发生了一次,我从手机中擦了擦所有用户数据并修复它。但它再次这样做,我试过在谷歌上看,但我无法找到一个解决方案。 ...

1  手机卡在fastboot模式下,无法启动到操作系统或恢复模式和闪烁库存rom没有帮助  ( Phone stuck in fastboot mode cant boot into os or recovery mode and flashing s ) 
当我试图几天前重新启动手机时,它引导到CSC FastBoot模式,它无法启动到OS中。我尝试了vol下来+电源关闭组合才能启动恢复,但这不起作用,在显示Android手机屏幕后,它再次出发。 CSC FastBoot屏幕与具有相同问题的另一电话(相同型号)的图像相同: 我使用fastboot解锁了引导加载程...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.