Jak mogę uruchomić skrypt podczas uruchamiania?


51

Jestem przyzwyczajony do uruchamiania skryptów podczas uruchamiania systemu Linux, ale nie jestem pewien, jak to zrobić w systemie Android. Chciałbym uruchomić mojego demona SSH przy starcie, więc zawsze będę mógł się połączyć. Jak mogę uruchomić dowolny skrypt na starcie Androida? Lepiej byłoby to zrobić poza Dalvik.

Odpowiedzi:


42

Rozglądając się po moim systemie plików Androida, zauważyłem, że tak, w rzeczywistości ma /etc/init.d/katalog. Po rozejrzeniu się, znalazłem /etc/init.d/20userinitnastępujące linie:

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;

Jest to oczywiście dokładnie to , czego potrzebowałem, napisałem następujący skrypt na moim komputerze, a następnie wypchnąłem go na urządzenie:

#!/system/bin/sh 

dropbear -s -g 

(przekazane do urządzenia za pośrednictwem scp userinit.sh phone:/data/local/userinit.sh, pamiętaj:))

Uruchom ponownie urządzenie, a następnie uruchomione ps | grep "[d]ropbear"i na pewno działa. Chłód!


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Firelord

9

/data/init.shuruchamia się przy rozruchu, jeśli masz root, możesz go edytować tak, jak chcesz. Bądź ostrożny ;)

Edycja: Najwyraźniej może być konieczne dodanie edytowanego skryptu do obrazu rozruchowego. Informacje o tym, jak to zrobić tutaj: http://forum.xda-developers.com/showthread.php?t=443994


1
Tak, nie mogę znaleźć tego pliku na moim Nexusie One z uruchomionym CM7-RC1. Zobaczę, czy find / -name "init.sh"coś się pojawi . Czy są jakieś inne skrypty uruchamiane przy starcie systemu?
Naftuli Kay

1
Powinieneś mieć taki, /etc/init.rcktóry uruchamia powłokę. Powinien wywołać init.sh, ale jeśli nie, możesz po prostu wywołać własny skrypt.
Mateusz

Niestety nie mam tego skryptu, ale znalazłem rozwiązanie.
Naftuli Kay

3
Jaka to wersja Androida? 4.3 ma, /dataale nie ma /data/init/.shlub /etc/init.rc. Grep nie znajdzie jakieś ciekawe wystąpienie napisu initw /etc(nawet rekurencyjne).
Stéphane Gourichon,

Czy masz pomysł, jak dodać skrypt startowy podczas budowania AOSP?
Saleh

4

Zajrzyj do /etc/katalogu. Zwykle umieszczany jest na /system/partycji, którą można zamontować jako 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"

Niektóre powyższe kroki mogą zostać zastąpione przez:

$ adb root
$ adb remount

a później ponownie zamontować RO:

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

Teraz Twoim zadaniem jest znalezienie pliku wykonywalnego lub *rcpliku, który zmodyfikujesz, aby osiągnąć swój cel:

$ find /etc -type f -perm +110
$ find /etc -name "*rc"
$ find /etc -name "init*"
$ grep -R /data /etc
$ grep -R /system /etc

Google o każdym kandydacie, aby dowiedzieć się, jak ten plik został wykorzystany.

Dobrym kandydatem do włączenia niestandardowych skryptów są wiersze z:

$ grep service /init*.rc

Ponieważ każde urządzenie jest unikalne, konieczne może być odgadnięcie kryteriów wyszukiwania ...

Na przykład znalazłem, /etc/mkshrcktóry używany przez powłokę Korna. Aktualizuję ten plik, aby rozszerzyć PATHenv var, a teraz za każdym razem mam adb shellw swojej ŚCIEŻCE dowiązania symboliczne Busybox!

Zobacz także trudny sposób (jeśli nie masz szczęścia ze znalezieniem magicznego pliku): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc


Ale czy nie jest nadpisywane przy każdym rozruchu? Myślę, że folder / etc jest częścią cpio, który jest ramdyskiem.
ransh,

1
@ransh nie dzieje się tak przynajmniej w: 8.1.0_r60 gdzie /systemjest system.imgi /etcjest dowiązaniem symbolicznym do /system.
Ciro Santilli 31 改造 中心 法轮功 六四 事件

1

Wypróbowałem wszystkie te metody i żadna z nich nie działała dla mnie. Jednak to, co zadziałało, opierało się na odpowiedzi lorda-ralfa-adolfa tutaj Jak uruchomić skrypt przy rozruchu w CM12.1?

w zasadzie znajdź plik /system/etc/install-recovery.shi dodaj następujący wiersz na początku /data/init.sh &

następnie

touch /data/init.sh
chmod 755 /data/init.sh

Gotowy! Możesz teraz włożyć wszystko, co chcesz, /data/init.shi będzie działać podczas uruchamiania. Jeśli pliku /system/etc/install-recovery.shnie ma w systemie, ta odpowiedź nie zadziała. Nie zawracaj sobie głowy tworzeniem go.


1
Właściwie mam system, w którym /system/etc/install-recovery.shnie był obecny, ale nadal jest uruchamiany przy rozruchu, jeśli jest obecny, więc warto to sprawdzić.
jcaron

1

Przed Androidem 5 sprawy były proste, kiedy SELinux nie był enforcing. Możesz umieścić swój kod w dowolnym skrypcie lub zastąpić plik binarny skryptem, który został uruchomiony z uprawnieniami roota podczas rozruchu. Inną metodą było zdefiniowanie initusługi niestandardowej specjalnie w celu wykonywania skryptów wsadowych z jakiegoś katalogu.

Na podstawie tych podejść niestandardowe programistów ROM wprowadzony inny pseudoinit.d zjawiska jak /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/itd.

Jednak proces działający z UID, 0ale w ograniczonym kontekście SELinux jest dość bezradny. Usługa rozpoczęła się w init.rcpliku z u:r:init:s0kontekstu nawet nie może uruchomić skrypt z /system/bin/, więc polityka SELinux musi być poprawione do wstrzykiwania nieograniczony kontekst np Magisk definiuje u:r:magisk:s0 . Następnie możliwe jest uruchomienie skryptu bezpośrednio jako initusługa lub z init.dkatalogu podobnego do.

Aby uzyskać szczegółowe informacje, zobacz Jak uruchomić plik wykonywalny podczas rozruchu i utrzymać go w działaniu?


0

Prosty sposób (działa):

  1. Przygotuj polecenia post boot w skrypcie, powiedz / system / xbin / post-boot (ustaw perm perm)

  2. Dodaj powyższą niestandardową ścieżkę skryptu na końcu pliku /system/etc/init.qcom.post_boot.sh

Na przykład:

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

Gotowy!

(Jeśli nie możesz znaleźć qcom post_boot (urządzenia Qualcomm), poszukaj skryptów post_boot)


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.