Como definir o bash como shell padrão?

10

Quando adbo em um dispositivo com Cyanogenmod, recebo um bom shell bash, prompt de cores e bashrc. Não vejo um link simbólico de / system / xbin / bash para / system / bin / sh. Como eles definem o shell padrão para bash em vez de sh? Procurei nos arquivos rc, mas não encontrei nada. Gostaria de fazer o mesmo na minha versão do Android, que não é o Cyanogenmod.

Atualizar

Depois de reinstalar do zero com o CM7, sou levado ao sh em vez do bash. Agora a questão é como definir o bash como padrão.

Ravi
fonte
Vanilla CM7 (construída a partir da fonte) cai-me em sh, não bash, quando eu uso adb para se conectar. Qual versão você está usando?
Eldarerathis
É 7.1.0.1 para o ViewSonic G Tablet. Eu não criei a partir de fontes embora.
Ravi

Respostas:

7

Quando adb shellé executado, o lado do Android também lança adb, que é executado /system/bin/sh -. Esse caminho é codificado em 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

Se você quiser alterar isso para o bash, precisará recompilar.

É possível executar alguns comandos do arquivo ao executar o shell interativo. Como escrito em system/core/sh/main.c, sh -(note o -para o modo interativo) lê os seguintes arquivos (nesta ordem):

  • /etc/profile
  • .profile(em relação ao diretório atual, é /.profileparaadb shell
  • $ENV(a variável de ambiente ENVdeve apontar para um arquivo)

Como /etc/e /são somente leitura, a única maneira de carregar algo foi configurando ENV. Provavelmente, você pode criar um link simbólico de /etc/profilepara /data/profilemontando a /leitura e gravação (exercício para o leitor).

Lekensteyn
fonte
11
/ etc é um link simbólico para a partição / system. I remontado que read-write e acrescentou / etc / profile, mas ele não é chamado por sh :(
Colin
5

Eu não tinha meu Android comigo agora para testar, mas com o Emulador de terminal Android, se você for ao menu, poderá usar a opção "Linha de comando" ou "Comando inicial".

insira a descrição da imagem aqui

Lie Ryan
fonte
Nossa, vou ter que experimentar esse menu no meu prompt do adb.
mchid
3

Esta é uma pergunta antiga, mas recentemente fiquei curioso sobre isso. Encontrei um método que não requer recompilação adbd, mas requer su(estou usando o Chainfire SuperSu 2.45).

Assumindo que bashestá localizado em /system/bin/bash, e suestá em /system/xbin/su, é essencialmente algo como isto:

  1. adb shell (use um shell interativo. Invocar esse processo como uma linha pode fazer com que o ADB pare de funcionar se houver um problema)
  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 Observe que seus caminhos podem ser diferentes; use which bashe which supara ter certeza.
  5. chmod 777 /system/bin/sh
  6. Teste o shell antes de sair: /system/bin/sh. Se você receber um erro, corrija o erro ou reverter, restaurando o backup: cp /system/bin/sh.bak /system/bin/sh.
  7. Remontar / sistema opcionalmente; a maioria dos dispositivos fará isso automaticamente: mount -o remount,ro /system

E você terminou.

Simplesmente ligar o BASH ao SH não funciona porque o bash emula o SH quando invocado dessa maneira.

No entanto, observando o strace, parece procurar um bashrcquando um BASH vinculado é chamado como 'sh --login'. Embora isso possa ser usado para "carregar em cadeia" shells via script, como mencionado acima, a maneira como o adbdSH é codificado é codificado.

Se houver um problema e você tiver removido (ou movido) o /system/bin/shADB não terá um shell para ajudá-lo a corrigir o problema. Se isso acontecer, você tem algumas opções:

  • Reinicie em uma recuperação que possui adbd(como CWM ou TWRP) e abra um shell adb para copiar /system/bin/sh.bak em / system / bin / sh novamente.
  • Use adb para copiar o backup: adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh observe que isso não funcionará em todos os dispositivos; alguns se recusam a permitir que o adb remonte / rw do sistema dessa maneira.
  • Use um emulador de terminal que possa ser configurado para executar um shell diferente; observe que vários tentarão / system / bin / sh primeiro e forçarão o fechamento.
psyincerise
fonte
0

No seu PC, obtenha um binário do bash e substitua /system/bin/sh. Eu tenho um aqui .

Sinta-se livre para copiar este código:

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
fonte