¿Cómo configurar bash como shell predeterminado?

10

Cuando agrego un dispositivo con Cyanogenmod, se me presenta un bonito bash shell, un indicador de color y bashrc. No veo un enlace simbólico de / system / xbin / bash a / system / bin / sh. ¿Cómo configuran el shell predeterminado para bash en lugar de sh? Miré a través de los archivos rc, pero no encontré nada. Me gustaría hacer lo mismo en mi compilación de Android, que no es Cyanogenmod.

Actualizar

Después de volver a instalar desde cero con CM7, me llevan a sh en lugar de bash. Ahora la pregunta es cómo configurar bash como predeterminado.

Ravi
fuente
Vanilla CM7 (construido a partir de la fuente) me deja caer sh, no bash, cuando uso adb para conectarme. Cual build está usando?
eldarerathis
Es 7.1.0.1 para la tableta ViewSonic G. Sin embargo, no construí a partir de fuentes.
Ravi

Respuestas:

7

Cuando adb shellse ejecuta, el lado de Android también inicia adb que luego se ejecuta /system/bin/sh -. Este camino está codificado en 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

Si desea cambiar esto a bash, tendrá que volver a compilarlo.

Es posible ejecutar algunos comandos desde el archivo cuando se ejecuta el shell interactivo. Como está escrito system/core/sh/main.c, sh -(tenga en cuenta el -modo interactivo) lee de los siguientes archivos (en este orden):

  • /etc/profile
  • .profile(en relación con el directorio actual, esto es /.profileparaadb shell
  • $ENV(la variable de entorno ENVdebe apuntar a un archivo)

Como /etc/y /son de solo lectura, la única forma de cargar algo era mediante la configuración ENV. Probablemente pueda crear un enlace simbólico desde /etc/profilea /data/profilemontando /lectura-escritura (ejercicio para el lector).

Lekensteyn
fuente
1
/ etc es un enlace simbólico a la partición / system. Remonté esa lectura-escritura y agregué / etc / profile pero sh no lo llama sh :(
Colin
5

No tenía mi Android conmigo ahora para probar, pero con el emulador de terminal de Android si va al menú, podría usar la opción "Línea de comando" o "Comando inicial".

ingrese la descripción de la imagen aquí

Lie Ryan
fuente
Gee, tendré que probar ese menú desde mi indicador adb.
mchid
3

Esta es una vieja pregunta, pero recientemente tuve curiosidad sobre esto. Encontré un método que no requiere recompilación adbd, pero sí requiere su(estoy usando Chainfire SuperSu 2.45).

Suponiendo que bashse encuentra en /system/bin/bash, y suestá en /system/xbin/su, es esencialmente algo como esto:

  1. adb shell (use un shell interactivo. Invocar este proceso como una línea podría hacer que ADB deje de funcionar si hay un 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 Tenga en cuenta que sus caminos pueden diferir; uso which bashy which supara estar seguro.
  5. chmod 777 /system/bin/sh
  6. Prueba de la cáscara antes de salir: /system/bin/sh. Si se produce un error, corregir el error o revertir mediante la restauración de la copia de seguridad: cp /system/bin/sh.bak /system/bin/sh.
  7. Opcionalmente montaje / sistema; la mayoría de los dispositivos harán esto automáticamente: mount -o remount,ro /system

Y tu estas listo.

Simplemente simular BASH a SH no funciona porque bash emula SH cuando se invoca de esta manera.

Sin embargo, al mirar strace, parece buscar un bashrccuando un BASH simbólico se llama como 'sh --login'. Si bien esto podría ser utilizado para "encadenar" shells a través de un script, como se mencionó anteriormente, la forma en que adbdinvoca SH está codificada.

Si hay un problema y ha eliminado (o movido) /system/bin/shADB no tendrá un shell que le permita solucionar el problema. Si esto sucede, tiene algunas opciones:

  • Reinicie en una recuperación que tenga adbd(como CWM o TWRP) y abra un shell adb para copiar /system/bin/sh.bak a / system / bin / sh nuevamente.
  • Use adb para copiar la copia de seguridad: adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh tenga en cuenta que esto no funcionará en todos los dispositivos; algunos se niegan a permitir que adb vuelva a montar / system rw de esta manera.
  • Use un emulador de terminal que se pueda configurar para ejecutar un shell diferente; tenga en cuenta que varios intentarán / system / bin / sh primero y forzarán el cierre.
psyincerise
fuente
0

En su PC, obtenga un binario bash y sobrescriba /system/bin/sh. Tengo uno aqui .

Siéntase libre de 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
fuente