Як я можу запустити сценарій під час завантаження?


51

Я звик запускати сценарії під час завантаження в Linux, але я не впевнений, як це зробити в Android. Я хотів би запустити свій демон SSH на старті, тому я завжди зможу підключитися. Як я можу запустити довільний скрипт на завантаженні Android? Краще робити це за межами Далвіка.

Відповіді:


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
Так, я не можу знайти цей файл на моєму Nexus One під керуванням CM7-RC1. Я побачу, чи find / -name "init.sh"виверне щось. Чи є інші сценарії, які працюють під час завантаження?
Naftuli Kay

1
У вас повинен бути /etc/init.rcоболонка, яка запускає оболонку. Він повинен зателефонувати init.sh, але якщо це не так, ви можете просто змусити його викликати власний сценарій.
Матвій

На жаль, у мене також немає цього сценарію, але я знайшов рішення.
Naftuli Kay

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/mkshrcщо використовується оболонка Korn. Я оновлюю цей файл, щоб розширити PATHenv var, і тепер кожен раз, коли у adb shellмене з'являються посилання Busybox у моїй PATH!

Дивіться також важкий шлях (якщо вам не пощастить знайти магічний файл): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc


Але хіба це не скасовує кожного завантаження? Я думаю, що папка / etc є частиною cpio, що є ramdisk.
ransh

1
@ransh це не так, принаймні в: 8.1.0_r60 де /systemє system.imgі /etcє символьним посиланням на /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контекстом не може навіть виконати сценарій оболонки з /system/bin/, так SELinux політика повинна бути виправлена , щоб ввести в необмеженій контексті , наприклад Magisk визначає u:r:magisk:s0 . Після цього можна запустити скрипт безпосередньо як initсервіс або з init.d-добного каталогу.

Докладніше див. Як запустити виконуваний файл під час завантаження та продовжувати його працювати?


0

Простий спосіб (робочий):

  1. Підготуйте команди для завантаження після публікації у сценарії, скажімо / system / xbin / post-boot (встановіть exec perm)

  2. Додайте вищевказаний шлях сценарію в кінці /system/etc/init.qcom.post_boot.sh

Наприклад:

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

Готово!

(Якщо ви не можете знайти qcom post_boot (пристрої Qualcomm), шукайте будь-які сценарії post_boot)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.