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.

Naftuli Kay
źródło

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!

Naftuli Kay
źródło
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

Matthew Read
źródło
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

gavenkoa
źródło
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.

Ramast
źródło
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?

Irfan Latif
źródło
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)

Seff
źródło