bash를 기본 쉘로 설정하는 방법은 무엇입니까?


10

Cyanogenmod가있는 장치에 adb를 넣으면 멋진 bash 쉘, 색상 프롬프트 및 bashrc가 표시됩니다. / system / xbin / bash에서 / system / bin / sh 로의 심볼릭 링크가 표시되지 않습니다. 기본 쉘을 sh 대신 bash로 어떻게 설정합니까? rc 파일을 살펴 보았지만 아무것도 찾지 못했습니다. Cyanogenmod가 아닌 Android 빌드에서 동일한 작업을 수행하고 싶습니다.

최신 정보

CM7로 처음부터 다시 설치하면 bash 대신 sh로 이동합니다. 이제 질문은 bash를 기본값으로 설정하는 방법입니다.


adb를 사용하여 연결하면 Vanilla CM7 (소스에서 빌드 됨)이 sh아닌에 떨어집니다 bash. 어떤 빌드를 사용하고 있습니까?
eldarerathis 님이

ViewSonic G Tablet의 경우 7.1.0.1입니다. 그래도 소스에서 빌드하지 않았습니다.
Ravi

답변:


7

경우 adb shell실행되고, 안드로이드 측면은 발사 된 후 실행한다을 ADB /system/bin/sh -. 이 경로는 다음과 같이 하드 코딩되어 있습니다 system/core/adb/services.c.

347 #if ADB_HOST
348 #define SHELL_COMMAND "/bin/sh"
349 #define ALTERNATE_SHELL_COMMAND ""
350 #else
351 #define SHELL_COMMAND "/system/bin/sh"
352 #define ALTERNATE_SHELL_COMMAND "/sbin/sh"
353 #endif

이것을 bash로 변경하려면 다시 컴파일해야합니다.

대화식 쉘을 실행할 때 파일에서 일부 명령을 실행할 수 있습니다. 에 기록 된 바와 같이 system/core/sh/main.c, sh -(음 -대화 형 모드)를 (이 순서대로) 다음 파일에서 읽습니다

  • /etc/profile
  • .profile(현재 디렉토리를 기준으로,이은 /.profile을 위해adb shell
  • $ENV(환경 변수 ENV는 파일을 가리켜 야합니다)

/etc//읽기 전용,로드 뭔가를 얻을 수있는 유일한 방법은 설정에 의해했다 ENV. 당신은 아마에서 심볼릭 링크를 만들 수 있습니다 /etc/profile/data/profile장착하여 /읽기 - 쓰기 (독자를위한 운동).


1
/ etc는 / system 파티션에 대한 심볼릭 링크입니다. 읽기 / 쓰기를 다시 마운트하고 / etc / profile을 추가했지만 sh에 의해 호출되지 않습니다. (
Colin


3

이것은 오래된 질문이지만 최근에 나 자신이 궁금했습니다. 재 컴파일이 필요없는 방법을 찾았 adbd지만 필요합니다 su(Chainfire SuperSu 2.45를 사용하고 있습니다).

가정은 bash에 위치 /system/bin/bash, 그리고 su에있다 /system/xbin/su가 본질적으로 같은 뭔가 :

  1. adb shell (대화식 쉘을 사용하십시오.이 프로세스를 단일 라이너로 호출하면 문제가있는 경우 ADB 작동이 중단 될 수 있습니다)
  2. mount -o remount,rw /system
  3. mv /system/bin/sh /system/bin/sh.bak
  4. echo -e '#!/system/bin/bash\n/system/xbin/su -mm -l -s /system/xbin/bash' > /system/bin/sh 경로가 다를 수 있습니다. 사용 which bash하고 which su확실하게.
  5. chmod 777 /system/bin/sh
  6. 종료하기 전에 쉘을 테스트하십시오 /system/bin/sh.. 오류가 발생하면 백업을 복원하여 오류를 수정하거나 되 돌리십시오 cp /system/bin/sh.bak /system/bin/sh..
  7. 선택적으로 / system을 다시 마운트하십시오. 대부분의 장치는이를 자동으로 수행합니다. mount -o remount,ro /system

그리고 당신은 끝났습니다.

이 방법으로 호출하면 bash가 SH를 에뮬레이트하므로 BASH를 SH에 바로 연결하는 것은 작동하지 않습니다.

그러나 strace를 살펴보면 bashrc심볼릭 링크 BASH가 'sh --login'이라고 불리는 것을 찾습니다. 이것은 스크립트를 통해 쉘을 "체인로드"하는 데 사용될 수 있지만 위에서 언급 한 것처럼 adbdSH를 호출 하는 방식 은 하드 코딩됩니다.

문제가 있고 제거 또는 이동 한 경우 /system/bin/shADB에는 문제를 해결하기위한 쉘이 없습니다. 이 경우 몇 가지 옵션이 있습니다.

  • adbdCWM 또는 TWRP와 같은 복구로 재부팅 하고 adb 쉘을 열어 /system/bin/sh.bak를 / system / bin / sh에 다시 복사하십시오.
  • adb를 사용하여 백업을 복사하십시오 adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh . 일부 장치에서는 작동하지 않습니다. 일부는 adb가 이러한 방식으로 / system rw를 다시 마운트하는 것을 거부합니다.
  • 다른 쉘을 실행하도록 설정할 수있는 터미널 에뮬레이터를 사용하십시오. 몇몇은 / system / bin / sh를 먼저 시도하고 강제 종료합니다.

0

PC에서 bash 바이너리를 가져 와서 덮어 씁니다 /system/bin/sh. 여기에 하나 있습니다 .

이 코드를 자유롭게 복사하십시오 :

git clone https://github.com/SuperDethByte/Bash-for-ARM.git        
cd Bash-for-ARM                
echo "Make sure your phone is plugged into your computer."          
sleep 5s                
echo "Remounting /system partition as r/w..."       
adb shell mount -o remount,rw /system          
echo "Making A Backup..."              
adb shell cp /system/bin/sh /system/bin/sh.bak         
echo "checking if backup was made..."          
if [ adb shell 'ls /system/bin/ | grep "sh.bak"' ]; then     
echo "pushing bash binary to android..."          
adb push bash /system/bin/sh       
echo "Remounting /system partition as r/o..."         
adb shell mount -o remount,ro /system          
echo "DONE"        
else         
echo "Backup Failed"           
echo "Remounting /system partition as r/o..."      
adb shell mount -o remount,ro /system     
fi   
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.