Когда я подключаюсь к устройству с помощью Cyanogenmod, я получаю красивую оболочку bash, цветовую подсказку и bashrc. Я не вижу символическую ссылку из /system/xbin/bash в /system/bin/sh. Как они устанавливают оболочку по умолчанию на bash вместо sh? Я просмотрел файлы rc, но ничего не нашел. Я хотел бы сделать то же самое на своей сборке Android, которая не является Cyanogenmod.
Обновлять
После переустановки с нуля с CM7 у меня вместо bash вылетает sh. Теперь вопрос в том, как установить bash по умолчанию.
Когда 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/profile
to /data/profile
, смонтировав /
чтение-запись (упражнение для читателя).
Прямо сейчас у меня не было с собой Android для тестирования, но с эмулятором терминала Android , если вы перейдете в меню, вы сможете использовать опцию «Командная строка» или «Начальная команда».
adb
Это старый вопрос, но недавно мне самому стало интересно. Я нашел метод, который не требует перекомпиляции adbd
, но требует su
(я использую Chainfire SuperSu 2.45).
Предполагая , что bash
он расположен в /system/bin/bash
и su
находится в /system/xbin/su
, это примерно так:
adb shell
(используйте интерактивную оболочку. Вызов этого процесса как однострочного может привести к прекращению работы ADB в случае возникновения проблемы)mount -o remount,rw /system
mv /system/bin/sh /system/bin/sh.bak
echo -e '#!/system/bin/bash\n/system/xbin/su -mm -l -s /system/xbin/bash' > /system/bin/sh
Обратите внимание, что ваши пути могут отличаться; использовать which bash
и which su
быть уверенным.chmod 777 /system/bin/sh
/system/bin/sh
. Если вы получили сообщение об ошибке, исправьте ее или восстановите резервную копию: cp /system/bin/sh.bak /system/bin/sh
.mount -o remount,ro /system
И вы сделали.
Простая символическая ссылка BASH на SH не работает, потому что bash эмулирует SH при вызове таким образом.
Однако, взглянув на strace, кажется, что он ищет, bashrc
когда символическая ссылка BASH вызывается как «sh --login». Хотя это можно было бы использовать для «цепной загрузки» оболочек через скрипт, как упоминалось выше, способ adbd
вызова SH жестко запрограммирован.
Если есть проблема, и вы удалили (или переместили) /system/bin/sh
ADB, у ADB не будет оболочки, чтобы дать вам решение проблемы. Если это произойдет, у вас есть несколько вариантов:
adbd
(например, CWM или TWRP), и откройте для него оболочку adb, чтобы снова скопировать /system/bin/sh.bak в /system/bin/sh.adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh
обратите внимание, что это не будет работать на всех устройствах; некоторые отказываются разрешать adb перемонтировать /system rw таким образом.На вашем ПК получите двоичный файл 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 году и lineageos :
adb shell -t bash -i
Вы входите в систему напрямую через bash в интерактивном режиме.
Чтобы не помнить эту команду все время, я лично использую псевдоним, просто добавьте его в свой ~/.bashrc
ящик в Linux:
alias adb_shell='adb shell -t bash -i'
source ~/.bashrc
Дальше все настроено, просто запускаем
adb_shell
и наслаждайтесь всеми bash
функциями, такими как завершение табуляции и прочее. \о/
эльдарератис
sh
, а неbash
, когда я использую adb для подключения. Какую сборку вы используете?Рави