我习惯于在Linux上启动时运行脚本,但是我不确定如何在Android中执行此操作。我想在启动时启动SSH守护进程,因此我将始终能够连接。如何在Android启动时运行任意脚本?最好在Dalvik之外执行此操作。

#1 楼

环顾我的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",当然,它正在运行。凉爽!

评论


评论不作进一步讨论;此对话已移至聊天。

–Firelord♦
19-10-22在8:22

#2 楼

/data/init.sh在引导时运行,如果您具有root用户,则可以根据需要对其进行编辑。请小心;)

编辑:显然,您可能也需要将编辑后的脚本拖入启动映像中。有关如何执行此操作的信息,请参见:http://forum.xda-developers.com/showthread.php?t=443994

评论


是的,我似乎无法在运行CM7-RC1的Nexus One上找到此文件。我将查看find / -name“ init.sh”是否打开了任何东西。在启动时还有其他脚本运行吗?

– Naftuli Kay
2011年3月2日21:32

您应该有一个/etc/init.rc来启动外壳程序。它应该调用init.sh,但如果不这样做,则可以使其调用自己的脚本。

–马修·雷德(Matthew Read)
2011年3月2日21:40

不幸的是,我也没有那个脚本,但是我确实找到了解决方案。

– Naftuli Kay
2011年3月2日在21:49

它是什么版本的Android? 4.3确实有/ data但没有/data/init/.sh或/etc/init.rc。 Grep在/ etc中找不到任何有趣的字符串init实例(甚至是递归的)。

–StéphaneGourichon
2013年12月7日18:32

您有什么想法在构建AOSP时如何添加启动脚本?

–萨利赫
18/09/22在15:40

#3 楼

查找到/etc/目录。通常将其放在/system/分区中,您可以将其安装为RW: />
,然后重新安装RO:

$ 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"


现在您的任务是查找可执行文件或*rc文件,您对其进行了修改以实现目标:

$ adb root
$ adb remount


有关每个候选者的Google信息,以了解如何使用此文件。

包含自定义脚本的很好的候选者是:

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


由于每个设备的唯一性,您可能需要自己对搜索条件进行猜测...

例如,我找到了Korn shell使用的/etc/mkshrc。我更新了此文件以扩展PATH env var,现在每次执行adb shell时,我的PATH中都有Busybox符号链接!

另请参阅困难的方式(如果您没有找到魔术文件的运气):https: //stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc

评论


但是,不是每次启动都覆盖它吗?我认为/ etc文件夹是属于ramdisk的cpio的一部分。

–疯狂
16 Dec 18'在17:09

@ransh至少在以下情况中不是这种情况:8.1.0_r60其中/ system是system.img,而/ etc是到/ system的符号链接。

– Ciro Santilli郝海东冠状病六四事件法轮功
19年1月31日在10:48

#4 楼

我尝试了所有这些方法,但对我来说都不起作用。
基本上,找到文件
/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的系统,但是如果存在,它仍会在引导时执行,因此值得检查。

– jcaron
18年8月8日在22:25

这是唯一适用于Android 9的功能。

–埃里克·塞巴斯塔(Eric Sebasta)
8月23日5:00

#5 楼

如果安装了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

#6 楼

在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文件中启动的服务甚至无法执行来自/system/bin/的Shell脚本,因此需要修补SELinux策略以注入不受限制的上下文,例如。 Magisk定义了u:r:magisk:s0。之后,可以直接作为init服务或从类似init.d的目录运行脚本。

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

#7 楼

简单的方法(工作):


在脚本中准备启动后的命令,例如/ system / xbin / post-boot(设置exec perm)
添加上面的自定义脚本/system/etc/init.qcom.post_boot.sh末尾的路径

例如:

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

完成!

(如果找不到qcom post_boot(高通设备),请查找任何post_boot脚本)