如何在启动时运行脚本?


51

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

Answers:


42

环顾我的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

9

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

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


1
是的,我似乎无法在运行CM7-RC1的Nexus One上找到此文件。我看看是否有find / -name "init.sh"任何变化。在启动时还有其他脚本运行吗?
Naftuli Kay 2011年

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

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

3
它是什么版本的Android?4.3确实有,/data但没有/data/init/.sh/etc/init.rc。Grep init/etc(甚至递归)中都找不到该字符串的任何有趣实例。
斯特凡纳·古里科

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

4

查找/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


但是,不是每次启动都覆盖它吗?我认为/ etc文件夹是ram盘cpio的一部分。
ransh 2013年

1
@ransh至少在以下情况中不是这种情况:8.1.0_r60 where /systemis system.img/etcis是进入的符号链接/system
Ciro Santilli新疆改造中心法轮功六四事件

1

我尝试了所有这些方法,但没有一个对我有用。但是,有效的方法是基于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不在您的系统中,那么此答案将对您不起作用。不要为创建它而烦恼。


1
实际上,我有一个/system/etc/install-recovery.sh不存在的系统,但是如果存在,它仍然会在引导时执行,因此值得检查。
jcaron

1

在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目录运行脚本。

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


0

简单方法(工作):

  1. 在脚本中准备您的启动后命令,例如/ system / xbin / post-boot(设置exec perm)

  2. 在/system/etc/init.qcom.post_boot.sh的末尾添加上述自定义脚本路径

例如:

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

做完了!

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.