ฉันจะเรียกใช้สคริปต์ขณะบู๊ตได้อย่างไร?


51

ฉันคุ้นเคยกับการเรียกใช้สคริปต์ในการบูตใน Linux แต่ฉันไม่แน่ใจว่าจะทำอย่างไรใน Android ฉันต้องการเริ่ม SSH daemon เมื่อเริ่มต้นดังนั้นฉันจะสามารถเชื่อมต่อได้ตลอดเวลา ฉันจะรันสคริปต์ที่กำหนดเองบนการบูต Android ได้อย่างไร มันจะดีกว่าถ้าทำสิ่งนี้นอก Dalvik

คำตอบ:


42

ในขณะที่มองไปรอบ ๆ ระบบไฟล์ Android ของฉันฉันพบว่ามันเป็นจริงแล้วมี/etc/init.d/ไดเรกทอรี หลังจากมองเข้าไปในนั้นฉันพบ/etc/init.d/20userinitกับบรรทัดต่อไปนี้:

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;

แน่นอนว่าสิ่งที่ฉันต้องการนี้ฉันเขียนสคริปต์ต่อไปนี้บนคอมพิวเตอร์ของฉันจากนั้นส่งไปยังอุปกรณ์ของฉัน:

#!/system/bin/sh 

dropbear -s -g 

(ผลักไปยังอุปกรณ์ผ่านscp userinit.sh phone:/data/local/userinit.shโปรดทราบว่า:])

รีบูทอุปกรณ์จากนั้นจึงวิ่งps | grep "[d]ropbear"และแน่นอนว่ามันกำลังทำงานอยู่ ความเย็น!


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Firelord

9

/data/init.shทำงานตอนบูตหากคุณมีรูทคุณสามารถแก้ไขได้ตามต้องการ ระวัง ;)

แก้ไข:เห็นได้ชัดว่าคุณอาจจำเป็นต้องใส่สคริปต์ที่แก้ไขเข้าไปในอิมเมจสำหรับบูตด้วยเช่นกัน ข้อมูลเกี่ยวกับวิธีการทำที่นี่: http://forum.xda-developers.com/showthread.php?t=443994


1
ใช่ฉันไม่พบไฟล์นี้ใน Nexus One ที่รัน CM7-RC1 ฉันจะดูว่ามีfind / -name "init.sh"อะไรเกิดขึ้นไหม มีสคริปต์อื่น ๆ ที่ทำงานในการบูตหรือไม่
Naftuli Kay

1
คุณควรจะมีอันไหน/etc/init.rcที่เริ่มเชลล์ มันควรเรียก init.sh แต่ถ้าไม่คุณก็สามารถเรียกมันว่าสคริปต์ของคุณเอง
Matthew อ่าน

น่าเสียดายที่ฉันไม่มีสคริปต์นั้น แต่ฉันหาวิธีแก้ปัญหา
Naftuli Kay

3
Android รุ่นใด 4.3 จะมี/dataแต่ไม่มีหรือ/data/init/.sh /etc/init.rcGrep ไม่พบอินสแตนซ์ที่น่าสนใจใด ๆ ของสตริงinitใน/etc(แม้แต่เรียกซ้ำ)
Stéphane Gourichon

คุณมีความคิดวิธีเพิ่มสคริปต์เริ่มต้นเมื่อสร้าง AOSP หรือไม่
Saleh

4

มองไปที่/etc/ไดเรกทอรี โดยปกติจะอยู่ใน/system/พาร์ติชันซึ่งคุณสามารถเมานท์เป็น 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"

บางขั้นตอนข้างต้นอาจถูกแทนที่ด้วย:

$ adb root
$ adb remount

และต่อมา remount RO:

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

ตอนนี้งานของคุณในการค้นหาไฟล์เรียกทำงานหรือ*rcไฟล์ที่คุณแก้ไขเพื่อให้บรรลุเป้าหมาย:

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

Google เกี่ยวกับผู้สมัครแต่ละคนเพื่อรับทราบวิธีการใช้ไฟล์นี้

ตัวเลือกที่ดีสำหรับการรวมสคริปต์ที่กำหนดเองคือบรรทัดจาก:

$ grep service /init*.rc

เนื่องจากแต่ละอุปกรณ์มีความแตกต่างกันคุณอาจจำเป็นต้องเดาเกี่ยวกับเกณฑ์การค้นหา ...

เช่นฉันพบ/etc/mkshrcที่ใช้โดย Korn เชลล์ ฉันอัปเดตไฟล์นี้เพื่อขยายPATHenv var และตอนนี้ทุกครั้งที่adb shellฉันมี symlink Busybox ใน PATH ของฉัน!

ดูวิธีที่ยากลำบากเช่นกัน (หากคุณไม่มีโชคกับการค้นหาไฟล์เวทย์มนตร์ ): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc


แต่มันไม่ได้ทำให้การบู๊ตทุกครั้งเปลี่ยนไปหรือ? ฉันคิดว่าโฟลเดอร์ / etc เป็นส่วนหนึ่งของ cpio ซึ่งเป็น ramdisk
ransh

1
@ransh กรณีนี้ไม่ได้อย่างน้อยใน: 8.1.0_r60 ที่/systemเป็นsystem.imgและ/etcเป็น symlink /systemเข้า
Ciro Santilli 新疆改造中心法轮功六四事件

1

ฉันลองใช้วิธีการเหล่านี้ทั้งหมดและไม่มีวิธีใดที่เหมาะกับฉัน สิ่งที่ใช้ได้ผลมาจากคำตอบของลอร์ด - ราล์ฟ - อดอล์ฟที่นี่ วิธีการเรียกใช้สคริปต์ในการบูตใน CM12.1?

โดยพื้นฐานแล้วค้นหาไฟล์ /system/etc/install-recovery.shและเพิ่มบรรทัดต่อไปนี้ที่จุดเริ่มต้น /data/init.sh &

แล้วก็

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

ทำ! ตอนนี้คุณสามารถใส่สิ่งที่คุณต้องการ/data/init.shและมันจะทำงานเมื่อเริ่มต้น หากไฟล์/system/etc/install-recovery.shไม่ได้อยู่ในระบบของคุณคำตอบนี้จะไม่ทำงานสำหรับคุณ อย่าไปสร้างมัน


1
ที่จริงแล้วฉันมีระบบที่/system/etc/install-recovery.shไม่ได้อยู่ แต่มันก็ยังคงดำเนินการในการบูตถ้ามีดังนั้นจึงควรตรวจสอบ
jcaron

1

สิ่งที่ง่ายก่อน Android 5 เมื่อ SELinux enforcingไม่ได้ คุณสามารถใส่รหัสของคุณในสคริปต์ใด ๆ หรือแทนที่ไบนารีด้วยสคริปต์ซึ่งดำเนินการด้วยสิทธิ์พิเศษในการบูต อีกวิธีหนึ่งก็คือการกำหนดinitบริการที่กำหนดเองโดยเฉพาะให้กับชุดสคริปต์รันจากบางไดเรกทอรี

ขึ้นอยู่กับวิธีการเหล่านี้นักพัฒนารอมที่กำหนดเองที่แตกต่างกันนำมาหลอกinit.dปรากฏการณ์เช่น/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/ฯลฯ

อย่างไรก็ตามกระบวนการทำงานกับ UID 0แต่ในบริบทที่ จำกัด ของ SELinux นั้นค่อนข้างช่วยเหลือไม่ได้ บริการเริ่มต้นในinit.rcไฟล์ที่มีu:r:init:s0บริบทไม่สามารถแม้แต่จะรันสคริปต์เปลือกจาก/system/bin/ดังนั้นความต้องการนโยบาย SELinux ที่จะปะฉีดไม่ จำกัดบริบทเช่นเวทย์กำหนด u:r:magisk:s0หลังจากนั้นเป็นไปได้ที่จะเรียกใช้สคริปต์โดยตรงเป็นinitบริการหรือจากinit.dไดเรกทอรีเหมือน

สำหรับรายละเอียดดูวิธีเรียกใช้ไฟล์ปฏิบัติการในการบู๊ตและใช้งานต่อไปได้?


0

วิธีง่ายๆ (ทำงาน):

  1. เตรียมคำสั่ง post boot ของคุณในสคริปต์, พูด / system / xbin / post-boot (ตั้งค่าการอนุญาตให้ใช้สิทธิ์)

  2. เพิ่มเส้นทางสคริปต์ที่กำหนดเองข้างต้นที่ส่วนท้ายของ /system/etc/init.qcom.post_boot.sh

เช่น:

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

ทำ!

(หากคุณไม่พบ qcom post_boot (อุปกรณ์ Qualcomm) ให้มองหาสคริปต์ post_boot ใด ๆ )


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.