부팅시 스크립트를 어떻게 실행할 수 있습니까?


51

Linux에서 부팅 할 때 스크립트를 실행하는 데 익숙하지만 Android에서이 작업을 수행하는 방법을 잘 모르겠습니다. 시작할 때 SSH 데몬을 시작하고 싶으므로 항상 연결할 수 있습니다. 안드로이드 부팅에서 임의의 스크립트를 어떻게 실행할 수 있습니까? Dalvik 외부에서이 작업을 수행하는 것이 좋습니다.

답변:


42

내 안드로이드 파일 시스템을 둘러 보면서 실제로 /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"하고 충분히 실행 중입니다. 시원함!


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
소방관

9

/data/init.sh부팅 할 때 실행되며 루트가 있으면 원하는대로 편집 할 수 있습니다. 조심해 ;)

편집 : 분명히 편집 된 스크립트를 부팅 이미지에 삽입해야 할 수도 있습니다. 여기에 방법에 대한 정보 : http://forum.xda-developers.com/showthread.php?t=443994


1
예, CM7-RC1을 실행하는 Nexus One에서이 파일을 찾을 수 없습니다. 나는 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.rc. 그렙는 문자열의 흥미로운 예를 찾을 수없는 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

나중에 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/mkshrcKorn 쉘에서 사용한 것을 발견했습니다 . 이 파일을 업데이트하여 PATHenv var 를 확장 했으며 이제는 매번 adb shellPATH에 Busybox 심볼릭 링크가 있습니다!

어려운 방법을 참조하십시오 ( 마법 파일 을 찾는 데 운이 없다면 ) : https : //.com/questions/9768103/make-persistent-changes-to-init-rc


그러나 매 부팅마다 무시되지 않습니까? / etc 폴더는 램 디스크 인 cpio의 일부라고 생각합니다.
ransh

1
8.1.0_r60 : @ransh이 적어도에서 그렇지 않은 /systemsystem.img/etc으로 심볼릭 링크이다 /system.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1

나는이 모든 방법을 시도했지만 그들 중 누구도 나를 위해 일하지 않았다. 그러나 CM12.1 에서 부팅시 스크립트를 실행하는 방법은 여기에서 lord-ralf-adolf의 답변을 기반으로했습니다 .

기본적으로 파일을 찾고 /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

SELinux가 아닌 안드로이드 5 이전의 상황은 간단했습니다 enforcing. 코드를 스크립트에 넣거나 바이너리를 부팅시 루트 권한으로 실행 된 스크립트로 바꿀 수 있습니다. 또 다른 방법은 init특정 디렉토리에서 스크립트를 일괄 실행하도록 사용자 지정 서비스 를 정의하는 것 입니다.

이러한 접근 방식을 기반으로 사용자 정의 ROM 개발자는 다른 도입 사이비의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 컨텍스트에서 실행되는 프로세스 는 무력합니다. context 로 init.rc파일 에서 시작된 서비스는 심지어 쉘 스크립트실행할 수 없으므로 Magisk define과 같은 무제한 컨텍스트 를 주입하기 위해 SELinux 정책을 패치해야 합니다 . 그 후 스크립트를 서비스로 또는 유사한 디렉토리 에서 직접 실행할 수 있습니다 .u:r:init:s0/system/bin/ u:r:magisk:s0initinit.d

자세한 내용은 부팅시 실행 파일을 실행하고 계속 실행하는 방법을 참조하십시오 .


0

간단한 방법 (작동) :

  1. 스크립트에서 부팅 후 명령을 준비합니다 (예 : / system / xbin / post-boot (set exec perm)).

  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.