Як встановити bash як оболонку за замовчуванням?


10

Коли я підключаюсь до пристрою із Cyanogenmod, мені надається приємна оболонка bash, кольоровий рядок та bashrc. Я не бачу симпосилання від / system / xbin / bash до / system / bin / sh. Як вони встановлюють оболонку за замовчуванням для bash замість sh? Я переглянув rc-файли, але нічого не знайшов. Я хотів би зробити те ж саме в моїй збірці Android, яка не є Cyanogenmod.

Оновлення

Після перевстановлення з нуля за допомогою CM7 я перейшов до sh замість bash. Тепер питання в тому, як встановити bash за замовчуванням.


Vanilla CM7 (побудований з джерела) shвідмовляється від мене , ні bash, коли я використовую adb для з'єднання. Яку збірку ви використовуєте?
eldarerathis

Це 7.1.0.1 для планшета ViewSonic G. Я не будував з джерел, хоча.
Раві

Відповіді:


7

Коли adb shellце виконано, Android сторона також запускає 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 є символьним посиланням на / системний розділ. Я зазначив, що читати-писати та додавати / etc / profile, але sh :(
Колін

5

Зараз у мене не було свого Android для тестування, але за допомогою Android Terminal Emulator, якщо ви перейдете до меню, можливо, ви зможете скористатися опцією "Командний рядок" або "Початкова команда".

введіть тут опис зображення


Боже, мені доведеться спробувати це меню з мого оголошення adb.
mchid

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. Необов'язково перераховувати / систему; більшість пристроїв зробить це автоматично: mount -o remount,ro /system

І ви закінчили.

Просто посилання BASH на SH не працює, тому що bash імітує SH, коли викликається таким чином.

Однак, дивлячись на страйс, схоже, він шукає, bashrcколи символічний BASH називається "sh --login". Хоча це може бути використане для "завантаження" оболонок за допомогою скрипту, як було зазначено вище, спосіб adbdвикликання SH жорстко кодується.

Якщо виникла проблема, і ви видалили (або перемістили) /system/bin/shADB, у вас немає оболонки, яка допоможе вам усунути проблему. Якщо це сталося, у вас є кілька варіантів:

  • Перезавантажте у відновлення, яке має adbd(наприклад, CWM або 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

На вашому ПК отримайте бінарний баш і перезапишіть /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   
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.