Как установить bash в качестве оболочки по умолчанию?

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

Обновлять

После переустановки с нуля с CM7 у меня вместо bash вылетает sh. Теперь вопрос в том, как установить bash по умолчанию.

Vanilla CM7 (построенный из исходного кода) бросает меня в sh, а не bash, когда я использую adb для подключения. Какую сборку вы используете?
Это 7.1.0.1 для планшета ViewSonic G. Я не строил из исходников.

Ответы (5)

Когда 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. Вы, вероятно, можете создать символическую ссылку from /etc/profileto /data/profile, смонтировав /чтение-запись (упражнение для читателя).

/etc — это символическая ссылка на раздел /system. Я перемонтировал это чтение-запись и добавил /etc/profile, но он не вызывается sh :(

Прямо сейчас у меня не было с собой Android для тестирования, но с эмулятором терминала Android , если вы перейдете в меню, вы сможете использовать опцию «Командная строка» или «Начальная команда».

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

Ну и дела, мне придется попробовать это меню из моей подсказки adb.
Ничего, связанного с вопросом ОП иadb

Это старый вопрос, но недавно мне самому стало интересно. Я нашел метод, который не требует перекомпиляции 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». Хотя это можно было бы использовать для «цепной загрузки» оболочек через скрипт, как упоминалось выше, способ adbdвызова SH жестко запрограммирован.

Если есть проблема, и вы удалили (или переместили) /system/bin/shADB, у ADB не будет оболочки, чтобы дать вам решение проблемы. Если это произойдет, у вас есть несколько вариантов:

  • Перезагрузитесь в рекавери, которое имеет 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 и принудительно закроются.

На вашем ПК получите двоичный файл 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   

Нашел правильный и простой способ из коробки Linux, даже в 2021 году и :

adb shell -t bash -i

Вы входите в систему напрямую через в интерактивном режиме.

Чтобы не помнить эту команду все время, я лично использую псевдоним, просто добавьте его в свой ~/.bashrcящик в Linux:

alias adb_shell='adb shell -t bash -i'
source ~/.bashrc

Дальше все настроено, просто запускаем

adb_shell

и наслаждайтесь всеми bashфункциями, такими как завершение табуляции и прочее. \о/