Answers:
环顾我的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,请注意:))
重新启动设备,然后运行ps | grep "[d]ropbear",并且确实可以运行。太酷了!
/data/init.sh在启动时运行,如果您具有root用户,则可以根据需要对其进行编辑。小心 ;)
编辑:显然,您可能还需要将编辑后的脚本拖入启动映像中。有关如何执行此操作的信息,请参见:http : //forum.xda-developers.com/showthread.php?t=443994
find / -name "init.sh"任何变化。在启动时还有其他脚本运行吗?
/etc/init.rc启动外壳程序。它应该调用init.sh,但如果不这样做,则可以使其调用自己的脚本。
/data但没有/data/init/.sh或/etc/init.rc。Grep init在/etc(甚至递归)中都找不到该字符串的任何有趣实例。
查找/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"
以上某些步骤可能被替换为:
$ adb root
$ adb remount
然后重新安装RO:
$ chmod o-w /system/etc
$ mount -o remount,ro /system
现在,您的任务是查找*rc可以修改以实现目标的可执行文件或文件:
$ find /etc -type f -perm +110
$ find /etc -name "*rc"
$ find /etc -name "init*"
$ grep -R /data /etc
$ grep -R /system /etc
Google关于每个候选人的信息,以了解如何使用此文件。
包含自定义脚本的很好的候选者来自以下行:
$ grep service /init*.rc
由于每台设备都是唯一的,因此您可能需要对搜索条件进行猜测...
例如,我发现/etc/mkshrcKorn shell使用了哪个。我更新了此文件以扩展PATHenv var,现在每次我adb shell在PATH中都有Busybox符号链接!
另请参阅困难的方式(如果您找不到查找魔术文件的运气):https : //stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc
/systemis system.img和/etcis是进入的符号链接/system。
我尝试了所有这些方法,但没有一个对我有用。但是,有效的方法是基于lord-ralf-adolf的回答, 如何在CM12.1的引导中运行脚本?
基本上,找到文件
/system/etc/install-recovery.sh并在开头添加以下行
/data/init.sh &
然后
touch /data/init.sh
chmod 755 /data/init.sh
做完了!现在,您可以放入任何内容/data/init.sh,它将在启动时运行。如果文件/system/etc/install-recovery.sh不在您的系统中,那么此答案将对您不起作用。不要为创建它而烦恼。
/system/etc/install-recovery.sh不存在的系统,但是如果存在,它仍然会在引导时执行,因此值得检查。
在Android 5之前的SELinux并非如此,当时一切都很简单enforcing。您可以将代码放入任何脚本中,也可以将二进制文件替换为在启动时以root特权执行的脚本。另一种方法是定义一个定制init服务,专门用于从某个目录中批量执行脚本。
以此为基础的定制ROM开发者推出了不同伪init.d现象一样/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/等。
但是,使用UID 0但在受限的SELinux上下文中运行的过程是非常无奈的。服务在启动init.rc与文件u:r:init:s0方面甚至无法执行shell脚本的/system/bin/,所以SELinux策略需要修补注入一个不受限制的情况下如Magisk 定义 u:r:magisk:s0。之后,可以直接作为init服务或从init.d-like目录运行脚本。
有关详细信息,请参见如何在启动时运行可执行文件并使其保持运行状态?
如果安装了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#boot-scripts