Bagaimana saya bisa menjalankan skrip saat boot?

51

Saya terbiasa menjalankan skrip saat boot di Linux, tapi saya tidak yakin bagaimana melakukan ini di Android. Saya ingin memulai daemon SSH saya saat mulai, jadi saya akan selalu dapat terhubung. Bagaimana saya bisa menjalankan skrip sewenang-wenang pada boot Android? Lebih baik melakukan ini di luar Dalvik.

Naftuli Kay
sumber

Jawaban:

42

Sambil melihat-lihat sistem file Android saya, saya menemukan itu, sebenarnya memiliki /etc/init.d/direktori. Setelah mengintip di sana, saya menemukan /etc/init.d/20userinitdengan baris berikut:

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;

Makhluk ini, tentu saja, persis apa yang saya butuhkan, saya menulis skrip berikut di komputer saya kemudian mendorongnya ke perangkat saya:

#!/system/bin/sh 

dropbear -s -g 

(didorong ke perangkat melalui scp userinit.sh phone:/data/local/userinit.sh, ingatkan Anda:])

Reboot perangkat, lalu berlari ps | grep "[d]ropbear", dan tentu saja, itu berjalan. Kesejukan!

Naftuli Kay
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Firelord
9

/data/init.shberjalan saat boot, jika Anda memiliki root, Anda dapat mengeditnya sesuka Anda. Hati-hati ;)

Sunting: Rupanya Anda mungkin perlu menyuntikkan skrip yang telah diedit ke dalam image boot juga. Info tentang cara melakukannya di sini: http://forum.xda-developers.com/showthread.php?t=443994

Matius Baca
sumber
1
Ya, sepertinya saya tidak dapat menemukan file ini di Nexus One saya yang menjalankan CM7-RC1. Saya akan melihat apakah ada yang find / -name "init.sh"berubah. Apakah ada skrip lain yang berjalan saat boot?
Naftuli Kay
1
Anda harus memiliki /etc/init.rcyang memulai shell. Itu harus memanggil init.sh tetapi jika tidak, Anda bisa membuatnya memanggil skrip Anda sendiri.
Matius Baca
Sayangnya, saya juga tidak memiliki skrip itu, tetapi saya menemukan solusi.
Naftuli Kay
3
Versi Android apa itu? 4.3 memang memiliki /datatetapi tidak /data/init/.shatau /etc/init.rc. Grep tidak menemukan contoh menarik dari string initdi /etc(bahkan rekursif).
Stéphane Gourichon
Apakah Anda tahu cara menambahkan skrip startup saat membuat AOSP?
Saleh
4

Lihat ke /etc/direktori. Biasanya ditempatkan di /system/partisi yang dapat Anda mount sebagai 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"

Beberapa langkah di atas dapat diganti dengan:

$ adb root
$ adb remount

dan kemudian remount RO:

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

Sekarang tugas Anda untuk menemukan *rcfile yang dapat dieksekusi atau Anda modifikasi untuk mencapai tujuan Anda:

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

Google tentang setiap kandidat untuk mengetahui bagaimana file ini digunakan.

Kandidat yang baik untuk menyertakan skrip khusus adalah baris dari:

$ grep service /init*.rc

Karena setiap perangkat unik, Anda mungkin perlu menebak sendiri tentang kriteria pencarian ...

Misalnya saya temukan /etc/mkshrcyang digunakan oleh shell Korn. Saya memperbarui file ini untuk memperpanjang PATHenv var dan sekarang setiap kali saya melakukannya adb shellsaya memiliki symlink Busybox di PATH saya!

Lihat juga dengan cara yang sulit (jika Anda tidak beruntung menemukan file ajaib ): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc

gavenkoa
sumber
Tapi bukankah itu semakin ditimpa setiap boot? Saya pikir folder / etc adalah bagian dari cpio yang merupakan ramdisk.
ransh
1
@ransh ini tidak terjadi setidaknya di: 8.1.0_r60 mana /systemadalah system.img, dan /etcmerupakan symlink ke /system.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1

Saya mencoba semua metode ini dan tidak ada yang bekerja untuk saya. Namun apa yang berhasil didasarkan pada jawaban lord-ralf-adolf di sini Bagaimana menjalankan skrip saat boot di CM12.1?

pada dasarnya, cari file /system/etc/install-recovery.shdan tambahkan baris berikut di awal /data/init.sh &

kemudian

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

Selesai! Anda sekarang dapat memasukkan apa pun yang Anda inginkan /data/init.shdan itu akan berjalan saat startup. Jika file /system/etc/install-recovery.shtidak ada di sistem Anda maka jawaban ini tidak akan berfungsi untuk Anda. Jangan repot-repot membuatnya.

Ramast
sumber
1
Sebenarnya, saya memiliki sistem di mana /system/etc/install-recovery.shtidak ada, tetapi masih dijalankan saat boot jika ada, jadi ada baiknya memeriksa.
jcaron
1

Segalanya sederhana sebelum Android 5 ketika SELinux tidak enforcing. Anda bisa meletakkan kode Anda di skrip apa pun atau mengganti biner dengan skrip yang dijalankan dengan hak akses root saat boot. Metode lain adalah mendefinisikan initlayanan kustom khusus untuk batch mengeksekusi skrip dari beberapa direktori.

Berdasarkan ini mendekati pengembang custom ROM diperkenalkan berbeda pseudoinit.d fenomena seperti /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/dll

Namun proses yang berjalan dengan UID 0tetapi dalam konteks SELinux terbatas sangat tidak berdaya. Sebuah layanan dimulai pada init.rcfile tersebut dengan u:r:init:s0konteks bahkan tidak bisa mengeksekusi shell script dari /system/bin/, sehingga kebutuhan kebijakan SELinux akan ditambal untuk menyuntikkan terbatas konteks misalnya Magisk mendefinisikan u:r:magisk:s0 . Setelah itu dimungkinkan untuk menjalankan skrip secara langsung sebagai initlayanan atau dari init.ddirektori-like.

Untuk detailnya lihat Bagaimana menjalankan executable pada boot dan membuatnya tetap berjalan?

Irfan Latif
sumber
0

Cara sederhana (bekerja):

  1. Siapkan perintah post boot Anda dalam sebuah skrip, misalkan / system / xbin / post-boot (atur perm exec)

  2. Tambahkan path skrip kustom di atas di akhir /system/etc/init.qcom.post_boot.sh

Misalnya:

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

Selesai!

(Jika Anda tidak dapat menemukan qcom post_boot (perangkat Qualcomm), cari skrip post_boot)

Seff
sumber