Bir betiği açılışta nasıl çalıştırabilirim?


51

Linux'ta önyüklemede komut dosyaları çalıştırmaya alışkınım ama Android'de bunun nasıl yapılacağından emin değilim. SSH arka planıma başlangıçta başlamak istiyorum, bu yüzden her zaman bağlanabileceğim. Android önyüklemesinde rastgele bir komut dosyasını nasıl çalıştırabilirim? Bunu Dalvik dışında yapmak tercih edilir.

Yanıtlar:


42

Android dosya sistemime bakarken, aslında bir /etc/init.d/dizinin olduğunu gördüm . Oraya göz gezdirdikten sonra /etc/init.d/20userinitşu satırları buldum :

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;

Tabii ki tam olarak ihtiyacım olan şey, şu senaryolarımı bilgisayarıma yazdım ve cihazıma aktardım:

#!/system/bin/sh 

dropbear -s -g 

(cihaza üzerinden itti scp userinit.sh phone:/data/local/userinit.sh, sen:])

Cihazı yeniden başlattıktan sonra çalıştırıldı ps | grep "[d]ropbear"ve çalıştığından eminim. Serinlik!


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Firelord

9

/data/init.shaçılışta çalışır, rootunuz varsa istediğiniz gibi düzenleyebilirsiniz. Dikkatli ol ;)

Düzenleme: Görünüşe göre düzenlenmiş betiği önyükleme görüntüsüne de eklemeniz gerekebilir. Burada bunun nasıl yapılacağı hakkında bilgi: http://forum.xda-developers.com/showthread.php?t=443994


1
Evet, bu dosyayı CM7-RC1 çalıştıran Nexus One'ımda bulamıyorum. Bir find / -name "init.sh"şey bulursa göreceğim . Açılışta çalışan başka bir komut dosyası var mı?
Naftuli Kay

1
/etc/init.rcKabuğu başlatan bir tane olmalıdır . İnit.sh'yi çağırmalı, ancak değilse, sadece kendi scriptinizi çağırmasını sağlayabilirsiniz.
Matthew

Ne yazık ki, o senaryo da bende yok, ama bir çözüm buldum.
Naftuli Kay

3
Android hangi sürümü? 4.3 var veya /datahayır . Grep dizesinin herhangi ilginç bir örneğini bulamazsa içinde (hatta özyinelemeli). /data/init/.sh/etc/init.rcinit/etc
Stéphane Gourichon

AOSP'yi oluştururken başlangıç ​​komut dosyasının nasıl ekleneceği hakkında bir fikriniz var mı?
Saleh

4

/etc/Dizine bak . Genellikle /system/RW olarak monte edebileceğiniz bölümlere yerleştirilir :

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

Yukarıdaki bazı adımlar aşağıdakilerle değiştirilebilir:

$ adb root
$ adb remount

ve daha sonra remount RO:

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

Artık göreviniz *rc, amacınıza ulaşmak için değiştirdiğiniz yürütülebilir dosya veya dosyayı bulmak :

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

Google bu dosyanın nasıl kullanıldığını bilmek için her aday hakkında.

Özel komut dosyaları dahil etmek için iyi bir aday aşağıdakilerden satırlardır:

$ grep service /init*.rc

Her cihaz benzersiz olduğundan, arama kriterleri hakkında kendi tahminde bulunmanız gerekebilir ...

Örneğin, /etc/mkshrchangisinin Korn kabuğu tarafından kullanıldığını buldum . PATHEnv var'ı uzatmak için bu dosyayı güncelledim ve şimdi her adb shellyaptığımda PATH'imde Busybox sembolik bağlantıları var!

Ayrıca zor yollara bakın ( sihirli dosya bulma konusunda şansınız yoksa ): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc


Fakat her önyüklemeden vazgeçilmiyor mu? / Etc klasörü ramdisk olan cpio'nun bir parçası olduğunu düşünüyorum.
Aralık'ta

1
8.1.0_r60: @ransh bu en azından durum böyle değildir /systemolduğunu system.imgve /etciçine bir sembolik bağdır /system.
Ciro Santilli,

1

Tüm bu yöntemleri denedim ve hiçbiri benim için çalıştı. Ancak ne işe yaradı lord-ralf- adolf'un buradaki cevabına dayanıyordu.

Temel olarak, dosyayı bulun /system/etc/install-recovery.shve başında aşağıdaki satırı ekleyin /data/init.sh &

sonra

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

Bitti! Şimdi ne istersen /data/init.shonu koyabilirsin ve başlangıçta çalışır. Dosya /system/etc/install-recovery.shsisteminizde değilse, bu cevap sizin için işe yaramayacaktır. Oluşturma zahmet etmeyin.


1
Aslında, var olmayan bir sistemim /system/etc/install-recovery.shvar, ama eğer varsa hala önyüklemede çalıştırılıyor, bu yüzden kontrol etmeye değer.
Jcaron,

1

SELinux olmadığında Android 5'ten önce işler basitti enforcing. Kodunuzu herhangi bir komut dosyasına koyabilir veya önyüklemede kök ayrıcalıklarıyla yürütülen bir komut dosyasıyla ikili dosyayı değiştirebilirsiniz. Başka bir yöntem, initözellikle bazı dizinden komut dosyalarını çalıştırmak için özel bir servis tanımlamaktı .

Bu yaklaşımların temelinde özel ROM geliştiricileri farklı tanıtılan sözdeinit.d gibi fenomen /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/vb

Ancak UID ile çalışan 0ancak sınırlı bir SELinux bağlamında çalışan bir işlem oldukça çaresiz. Bir hizmet başlayan init.rcsisteminde kayıtlı u:r:init:s0bağlamında bile shell script yürütemediğinden gelen /system/bin/SELinux'un politikası bir enjekte yamalı gerekiyor böylece, sınırsız bağlam mesela Magisk tanımlar u:r:magisk:s0 . Bundan sonra bir betiği doğrudan initservis olarak veya init.dbenzeri dizinden çalıştırmak mümkündür .

Ayrıntılar için bkz. Yürütülebilir dosyayı önyükleme sırasında çalıştırma ve çalıştırmaya devam etme?


0

Basit bir yol (çalışma):

  1. Önyükleme sonrası komutlarınızı bir komut dosyasında hazırlayın, / system / xbin / önyükleme sonrası (set exec perm)

  2. /System/etc/init.qcom.post_boot.sh komutunun sonuna yukarıdaki özel komut dosyası yolunu ekleyin

Örneğin:

yankı / sistem / xbin / önyükleme sonrası >> /system/etc/init.qcom.post_boot.sh

Bitti!

(Qcom post_boot'u (Qualcomm cihazları) bulamazsanız, herhangi bir post_boot komut dosyasını arayın)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.