Làm thế nào tôi có thể chạy một kịch bản khi khởi động?


51

Tôi đã quen với việc chạy các kịch bản khi khởi động trong Linux, nhưng tôi không chắc làm thế nào để làm điều này trong Android. Tôi muốn bắt đầu trình nền SSH của mình khi bắt đầu, vì vậy tôi sẽ luôn có thể kết nối. Làm cách nào để chạy tập lệnh tùy ý khi khởi động Android? Nên làm điều này bên ngoài Dalvik.

Câu trả lời:


42

Trong khi nhìn xung quanh hệ thống tập tin Android của tôi, tôi thấy rằng nó thực sự có một /etc/init.d/thư mục. Sau khi nhìn trộm xung quanh trong đó, tôi tìm thấy /etc/init.d/20userinitvới các dòng sau:

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;

Tất nhiên, đây chính xác là những gì tôi cần, tôi đã viết đoạn script sau trên máy tính của mình sau đó đẩy nó vào thiết bị của mình:

#!/system/bin/sh 

dropbear -s -g 

(đẩy đến thiết bị thông qua scp userinit.sh phone:/data/local/userinit.sh, nhớ bạn:])

Khởi động lại thiết bị, sau đó chạy ps | grep "[d]ropbear"và chắc chắn, nó đang chạy. Thật tuyệt!


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Firelord

9

/data/init.shchạy khi khởi động, nếu bạn có root, bạn có thể chỉnh sửa nó theo ý muốn. Hãy cẩn thận ;)

Chỉnh sửa: Rõ ràng bạn cũng có thể cần phải chỉnh sửa tập lệnh đã chỉnh sửa thành hình ảnh khởi động. Thông tin về cách thực hiện điều đó tại đây: http://forum.xda-developers.com/showthread.php?t=443994


1
Vâng, dường như tôi không thể tìm thấy tệp này trên Nexus One của mình đang chạy CM7-RC1. Tôi sẽ xem nếu một cái find / -name "init.sh"gì đó bật lên. Có tập lệnh nào khác chạy trên boot không?
Naftuli Kay

1
Bạn nên có một /etc/init.rccái bắt đầu vỏ. Nó sẽ gọi init.sh nhưng nếu không, bạn chỉ có thể gọi nó là tập lệnh của riêng bạn.
Matthew Đọc

Thật không may, tôi cũng không có kịch bản đó, nhưng tôi đã tìm ra giải pháp.
Naftuli Kay

3
Phiên bản Android là gì? 4.3 không có /datanhưng không có /data/init/.shhoặc /etc/init.rc. Grep không tìm thấy bất kỳ trường hợp thú vị nào của chuỗi inittrong /etc(thậm chí đệ quy).
Stéphane Gourichon

Bạn có ý tưởng nào để thêm tập lệnh khởi động khi xây dựng AOSP không?
Saleh

4

Nhìn vào /etc/thư mục. Thông thường nó được đặt trong /system/phân vùng mà bạn có thể gắn kết như 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"

Một số bước trên có thể được thay thế bằng:

$ adb root
$ adb remount

và sau đó kể lại RO:

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

Bây giờ nhiệm vụ của bạn là tìm tệp thực thi hoặc *rctệp mà bạn sửa đổi để đạt được mục tiêu của mình:

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

Google về từng ứng cử viên để biết cách sử dụng tệp này.

Ứng cử viên tốt để bao gồm các tập lệnh tùy chỉnh là các dòng từ:

$ grep service /init*.rc

Vì mỗi thiết bị là duy nhất, bạn có thể cần đoán riêng về tiêu chí tìm kiếm ...

Ví dụ tôi tìm thấy /etc/mkshrcđược sử dụng bởi vỏ Korn. Tôi cập nhật tệp này để mở rộng PATHvar env và bây giờ mỗi lần adb shelltôi có symlink Busybox trong PATH của mình!

Cũng xem cách khó khăn (nếu bạn không có may mắn với việc tìm kiếm tệp ma thuật ): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc


Nhưng nó không bị quá tải mỗi khi khởi động sao? Tôi nghĩ thư mục / etc là một phần của cpio là ramdisk.
chuộc

1
@ransh đây không phải là trường hợp ít nhất là trong: 8.1.0_r60 nơi /systemsystem.img, và /etclà một liên kết tượng trưng vào /system.
Ciro Santilli 新疆 心 心

1

Tôi đã thử tất cả các phương pháp này và không có phương pháp nào hiệu quả với tôi. Tuy nhiên, điều gì đã làm việc dựa trên câu trả lời của chúa tể-ralf-adolf ở đây Làm thế nào để chạy tập lệnh khi khởi động trong CM12.1?

về cơ bản, tìm tập tin /system/etc/install-recovery.shvà thêm dòng sau vào đầu /data/init.sh &

sau đó

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

Làm xong! Bây giờ bạn có thể đặt bất cứ thứ gì bạn muốn vào /data/init.shvà nó sẽ chạy khi khởi động. Nếu tệp /system/etc/install-recovery.shkhông có trong hệ thống của bạn thì câu trả lời này sẽ không phù hợp với bạn. Đừng bận tâm tạo ra nó.


1
Trên thực tế, tôi có một hệ thống /system/etc/install-recovery.shkhông có mặt, nhưng nó vẫn được thực thi khi khởi động nếu có, vì vậy nó đáng để kiểm tra.
jcaron

1

Mọi thứ trở nên đơn giản trước Android 5 khi Selinux không hoạt động enforcing. Bạn có thể đặt mã của mình vào bất kỳ tập lệnh nào hoặc thay thế tệp nhị phân bằng tập lệnh được thực thi bằng quyền root khi khởi động. Một phương pháp khác là xác định một initdịch vụ tùy chỉnh cụ thể để thực thi các tập lệnh thực thi từ một số thư mục.

Dựa trên những phương pháp tiếp cận các nhà phát triển ROM tùy chỉnh giới thiệu khác nhau pseudo-init.d hiện tượng như /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/, vv

Tuy nhiên, một quá trình chạy với UID 0nhưng trong bối cảnh SELinux bị hạn chế là khá bất lực. Một dịch vụ bắt đầu vào init.rctập tin với u:r:init:s0bối cảnh thậm chí không thể thực hiện một kịch bản shell từ /system/bin/, vì vậy nhu cầu chính sách SELinux để được vá để tiêm một hạn chế bối cảnh ví dụ Magisk định nghĩa u:r:magisk:s0 . Sau đó, có thể chạy tập lệnh trực tiếp dưới dạng initdịch vụ hoặc init.dthư mục giống như.

Để biết chi tiết, xem Làm thế nào để chạy một thực thi khi khởi động và giữ cho nó chạy?


0

Cách đơn giản (làm việc):

  1. Chuẩn bị các lệnh khởi động bài đăng của bạn trong một tập lệnh, nói / system / xbin / post-boot (set exec perm)

  2. Thêm đường dẫn tập lệnh tùy chỉnh ở trên vào cuối /system/etc/init.qcom.post_boot.sh

Ví dụ:

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

Làm xong!

(Nếu bạn không thể tìm thấy qcom post_boot (thiết bị Qualcomm), hãy tìm bất kỳ tập lệnh post_boot nào)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.