Как я могу запустить скрипт при загрузке?

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", и, конечно же, он работает. Прохлада!

Нафтули Кей
источник
Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат .
Повелитель огня
9

/data/init.shзапускается при загрузке, если у вас есть root, вы можете редактировать его как хотите. Быть осторожен ;)

Редактировать: По-видимому, вам может понадобиться вставить отредактированный скрипт в образ загрузки. Информация о том, как это сделать, здесь: http://forum.xda-developers.com/showthread.php?t=443994

Мэтью Рид
источник
1
Да, я не могу найти этот файл на моем Nexus One под управлением CM7-RC1. Я посмотрю, если что- find / -name "init.sh"нибудь получится. Есть ли другие скрипты, которые запускаются при загрузке?
Нафтули Кей
1
Вы должны иметь, /etc/init.rcкоторый запускает оболочку. Он должен вызывать init.sh, но если это не так, вы можете просто заставить его вызывать свой собственный скрипт.
Мэтью Читал
К сожалению, у меня тоже нет этого сценария, но я нашел решение.
Нафтули Кей
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

gavenkoa
источник
Но разве это не переопределяется при каждой загрузке? Я думаю, что папка / etc является частью cpio, которая является ramdisk.
ransh
1
@ransh это не так, по крайней мере, в: 8.1.0_r60, где /systemесть system.imgи /etcявляется символической ссылкой на /system.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
1

Я перепробовал все эти методы, и ни один из них не помог мне. Однако то, что сработало, было основано на ответе лорда-ральфа-адольфа здесь. Как запустить скрипт при загрузке в 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не находится в вашей системе, то этот ответ не будет работать для вас. Не беспокойтесь о создании этого.

Ramast
источник
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)

Seff
источник