Jak ustawić bash jako domyślną powłokę?

10

Kiedy adbuję się w urządzenie z Cyanogenmod, pojawia się mi ładna powłoka bash, kolor zachęty i bashrc. Nie widzę dowiązania symbolicznego z / system / xbin / bash do / system / bin / sh. Jak ustawiają domyślną powłokę na bash zamiast sh? Przeglądałem pliki rc, ale nic nie znalazłem. Chciałbym zrobić to samo na mojej wersji Androida, która nie jest Cyanogenmod.

Aktualizacja

Po ponownej instalacji od zera za pomocą CM7, jestem przeniesiony do sh zamiast bash. Teraz pytanie brzmi, jak ustawić bash jako domyślny.

Ravi
źródło
Vanilla CM7 (zbudowany ze źródła) upuszcza mnie sh, nie bash, kiedy używam adb do połączenia. Jakiej wersji używasz?
eldarerathis
Jest to wersja 7.1.0.1 dla tabletu ViewSonic G. Nie budowałem jednak ze źródeł.
Ravi

Odpowiedzi:

7

Po adb shelluruchomieniu strona z Androidem uruchamia również adb, który następnie się uruchamia /system/bin/sh -. Ta ścieżka jest na stałe zakodowana w 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

Jeśli chcesz zmienić to na bash, będziesz musiał go ponownie skompilować.

Możliwe jest wykonanie niektórych poleceń z pliku podczas uruchamiania interaktywnej powłoki. Jak napisano w system/core/sh/main.c, sh -(pamiętać, że -w trybie interaktywnym) odczytuje z następujących plików (w tej kolejności):

  • /etc/profile
  • .profile(w stosunku do bieżącego katalogu, to jest /.profiledlaadb shell
  • $ENV(zmienna środowiskowa ENVpowinna wskazywać na plik)

Jak /etc/i /są tylko do odczytu, jedynym sposobem, aby dostać coś załadowany był przez ustawienie ENV. Prawdopodobnie możesz utworzyć dowiązanie symboliczne od /etc/profiledo /data/profile, instalując /odczyt-zapis (ćwiczenie dla czytelnika).

Lekensteyn
źródło
1
/ etc jest dowiązaniem symbolicznym do partycji / system. Ponownie zamontowałem ten plik do odczytu i zapisu i dodałem / etc / profile, ale nie wywołuje go sh :(
Colin
3

To stare pytanie, ale sam ostatnio byłem tym ciekawy. Znalazłem metodę, która nie wymaga ponownej kompilacji adbd, jednak wymaga jej su(używam Chainfire SuperSu 2.45).

Zakładając, że bashznajduje się w /system/bin/bash, i sujest w /system/xbin/su, jest to zasadniczo coś takiego:

  1. adb shell (użyj interaktywnej powłoki. Wywołanie tego procesu jako jednowierszowego może spowodować, że ADB przestanie działać, jeśli wystąpi problem)
  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 Pamiętaj, że twoje ścieżki mogą się różnić; użyj which bashi which sudla pewności.
  5. chmod 777 /system/bin/sh
  6. Przetestować powłokę przed zamknięciem: /system/bin/sh. Jeśli pojawi się błąd, napraw błąd lub przywróć, przywracając kopię zapasową:cp /system/bin/sh.bak /system/bin/sh .
  7. Opcjonalnie ponownie zamontować / system; większość urządzeń zrobi to automatycznie: mount -o remount,ro /system

I jesteś skończony.

Po prostu symlinkowanie BASH do SH nie działa, ponieważ bash emuluje SH po wywołaniu w ten sposób.

Jednak patrząc na strace, wydaje się, że szuka, bashrckiedy BASH z dowiązaniem symbolicznym jest nazywany „sh -login”. Chociaż można tego użyć do „ładowania łańcucha” powłok za pomocą skryptu, jak wspomniano powyżej, sposób adbdwywoływania SH jest zakodowany na stałe.

Jeśli występuje problem i usunąłeś (lub przeniosłeś) /system/bin/shADB, nie będziesz miał powłoki, która da ci rozwiązanie problemu. Jeśli tak się stanie, masz kilka opcji:

  • Uruchom ponownie w trybie odzyskiwania, który ma adbd (np. CWM lub TWRP) i otwórz do niego powłokę adb, aby ponownie skopiować /system/bin/sh.bak do / system / bin / sh.
  • Użyj adb, aby skopiować kopię zapasową: adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh Pamiętaj, że to nie zadziała na wszystkich urządzeniach; niektórzy odmawiają zezwalania adb na ponowne podłączenie / system rw w ten sposób.
  • Użyj emulatora terminala, który można ustawić tak, aby uruchamiał inną powłokę; zauważ, że kilku spróbuje najpierw / system / bin / sh i wymusi zamknięcie.
psyincerise
źródło
0

Na komputerze otrzymasz bash binarny i nadpisuj /system/bin/sh. Mam tutaj jeden .

Skopiuj ten kod:

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   
DarkProphet
źródło