Wie kann ich ein Skript beim Booten ausführen?

51

Ich bin es gewohnt, Skripte unter Linux beim Booten auszuführen, bin mir aber nicht sicher, wie ich das unter Android machen soll. Ich möchte meinen SSH-Daemon beim Start starten, damit ich immer eine Verbindung herstellen kann. Wie kann ich ein beliebiges Skript beim Booten mit Android ausführen? Es wäre besser, dies außerhalb von Dalvik zu tun.

Naftuli Kay
quelle

Antworten:

42

Als ich mich in meinem Android-Dateisystem umsah, stellte ich fest, dass es tatsächlich ein /etc/init.d/Verzeichnis hat. Nachdem ich mich dort umgesehen hatte, fand ich /etc/init.d/20userinitfolgende Zeilen:

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;

Da dies natürlich genau das war , was ich brauchte, schrieb ich das folgende Skript auf meinem Computer und schob es dann auf mein Gerät:

#!/system/bin/sh 

dropbear -s -g 

(Gedrückt zum Gerät über scp userinit.sh phone:/data/local/userinit.sh, wohlgemerkt:])

Starten Sie das Gerät neu und lassen Sie es dann ps | grep "[d]ropbear"laufen. Kühle!

Naftuli Kay
quelle
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Feuerfürst
9

/data/init.shLäuft beim Booten. Wenn Sie root haben, können Sie es nach Belieben bearbeiten. Achtung ;)

Bearbeiten: Möglicherweise müssen Sie das bearbeitete Skript auch in das Boot-Image einbinden. Informationen dazu finden Sie hier: http://forum.xda-developers.com/showthread.php?t=443994

Matthew Read
quelle
1
Ja, ich kann diese Datei auf meinem Nexus One mit CM7-RC1 nicht finden. Ich werde sehen, ob find / -name "init.sh"etwas auftaucht. Gibt es andere Skripte, die beim Booten ausgeführt werden?
Naftuli Kay
1
Sie sollten eine haben, /etc/init.rcdie die Shell startet. Es sollte init.sh aufrufen, aber wenn dies nicht der Fall ist, können Sie es einfach dazu bringen, Ihr eigenes Skript aufzurufen.
Matthew Read
Leider habe ich dieses Skript auch nicht, aber ich habe eine Lösung gefunden.
Naftuli Kay
3
Welche Version von Android ist das? 4.3 hat /dataaber keine /data/init/.shoder /etc/init.rc. Grep findet keine interessante Instanz des Strings initin /etc(auch nicht rekursiv).
Stéphane Gourichon
Haben Sie eine Idee, wie Sie beim Erstellen von AOSP ein Startskript hinzufügen können?
Saleh
4

Schau in das /etc/Verzeichnis. Normalerweise befindet es sich in einer /system/Partition, die Sie als RW einbinden können:

$ 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"

Einige der obigen Schritte können ersetzt werden durch:

$ adb root
$ adb remount

und später wieder einhängen RO:

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

Nun müssen Sie die ausführbare *rcDatei oder Datei finden, die Sie ändern, um Ihr Ziel zu erreichen:

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

Google über jeden Kandidaten, um zu erfahren, wie diese Datei verwendet wurde.

Ein guter Kandidat für das Einbinden von benutzerdefinierten Skripten sind Zeilen aus:

$ grep service /init*.rc

Da jedes Gerät einzigartig ist, müssen Sie möglicherweise eigene Vermutungen über Suchkriterien anstellen ...

Zum Beispiel habe ich /etc/mkshrcdie von Korn verwendete Shell gefunden. Ich aktualisiere diese Datei, um PATHenv var zu erweitern, und jetzt habe ich jedes Mal adb shellBusybox-Symlinks in meinem PATH!

Siehe auch hard way (wenn Sie kein Glück haben, Magic File zu finden): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc

gavenkoa
quelle
Aber wird es nicht bei jedem Boot übersteuert? Ich denke, der / etc-Ordner ist Teil von cpio, das ist Ramdisk.
Ransh
1
@ransh Dies ist nicht der Fall, zumindest in: 8.1.0_r60 wo /systemist system.imgund /etcist ein Symlink in /system.
Ciro Santilli am
1

Ich habe alle diese Methoden ausprobiert und keine davon hat für mich funktioniert. Was jedoch funktionierte, basierte auf der Antwort von Lord-Ralf-Adolf hier. Wie führe ich ein Skript beim Booten in CM12.1 aus?

Suchen Sie im Grunde die Datei /system/etc/install-recovery.shund fügen Sie die folgende Zeile am Anfang hinzu /data/init.sh &

dann

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

Getan! Sie können nun alles eingeben, was Sie möchten, /data/init.shund es wird beim Start ausgeführt. Befindet sich die Datei /system/etc/install-recovery.shnicht in Ihrem System, funktioniert diese Antwort für Sie nicht. Mach dir nicht die Mühe, es zu schaffen.

Ramast
quelle
1
Eigentlich habe ich ein System, auf dem /system/etc/install-recovery.shes nicht vorhanden war, aber es wird immer noch beim Booten ausgeführt, falls vorhanden. Es lohnt sich also, es zu überprüfen.
Jcaron
1

Vor Android 5 waren die Dinge einfach, während SELinux dies nicht war enforcing. Sie können Ihren Code in jedes Skript einfügen oder eine Binärdatei durch ein Skript ersetzen, das beim Booten mit Root-Rechten ausgeführt wurde. Eine andere Methode bestand darin, einen benutzerdefinierten initDienst zu definieren , der speziell zum Batch-Ausführen von Skripten aus einem bestimmten Verzeichnis dient.

Basierend auf diesen Ansätzen Custom ROM - Entwickler unterschiedliche eingeführt pseudo-init.d Phänomen wie /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/usw.

Ein Prozess, der mit UID 0aber in einem eingeschränkten SELinux-Kontext ausgeführt wird, ist jedoch ziemlich hilflos. Ein Dienst in gestarteten init.rcDatei mit u:r:init:s0Kontext kann nicht einmal einen Shell - Skript ausführt aus /system/bin/, so SELinux politische Bedürfnisse, ein zu injizieren gepatcht werden uneingeschränkt Kontext zB Magisk definiert u:r:magisk:s0 . Danach ist es möglich, ein Skript direkt als initDienst oder aus einem init.dähnlichen Verzeichnis auszuführen .

Weitere Informationen finden Sie unter Ausführen einer ausführbaren Datei beim Start und Beibehalten der Ausführung.

Irfan Latif
quelle
0

Einfacher Weg (Arbeiten):

  1. Bereiten Sie Ihre Post-Boot-Befehle in einem Skript vor, sagen Sie / system / xbin / post-boot (set exec perm)

  2. Fügen Sie den obigen benutzerdefinierten Skriptpfad am Ende von /system/etc/init.qcom.post_boot.sh hinzu

Z.B:

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

Getan!

(Wenn Sie das qcom post_boot (Qualcomm-Geräte) nicht finden können, suchen Sie nach Post_boot-Skripten.)

Seff
quelle