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

10

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

Обновить

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

Ravi
источник
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, установив /чтение-запись (упражнение для читателя).

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

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

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

Ли Райан
источник
Ну и дела, мне придется попробовать это меню из моей подсказки 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 при вызове таким способом.

Однако, взглянув на strace, он, похоже, ищет, 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 и принудительно закроют.
psyincerise
источник
0

На вашем компьютере установите 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   
DarkProphet
источник