13 votos

¿Cómo establecer bash como shell por defecto?

Cuando adb en un dispositivo con Cyanogenmod, se me presenta un bonito shell bash, color prompt, y bashrc. No veo un enlace simbólico de /system/xbin/bash a /system/bin/sh. ¿Cómo se establece el shell por defecto a bash en lugar de sh? Busqué en los archivos rc, pero no encontré nada. Me gustaría hacer lo mismo en mi build de Android, que no es Cyanogenmod.

Actualización

Después de reinstalar desde cero con CM7, me lleva a sh en lugar de bash. Ahora la pregunta es cómo establecer bash por defecto.

0 votos

Vanilla CM7 (construido desde el código fuente) me deja en sh no bash cuando uso adb para conectarme. ¿Qué construcción está utilizando?

0 votos

Es 7.1.0.1 para la ViewSonic G Tablet. Sin embargo, no construí desde las fuentes.

8voto

Lekensteyn Puntos 568

Cuando adb shell se ejecuta, el lado de Android también lanza adb que luego ejecuta /system/bin/sh - . Esta ruta está codificada 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 quieres cambiar esto a bash, tendrás que recompilarlo.

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

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

Como /etc/ y / son de sólo lectura, la única manera de conseguir que se cargue algo era estableciendo ENV . Probablemente pueda crear un enlace simbólico desde /etc/profile a /data/profile mediante el montaje / lectura-escritura (ejercicio para el lector).

1 votos

/etc es un enlace simbólico a la partición /system. Volví a montar esa lectura-escritura y añadí /etc/profile pero no es llamado por sh :(

4voto

Lie Ryan Puntos 15629

No tenía mi Android conmigo en este momento para probar, pero con el Emulador de terminal Android si vas al menú, podrás utilizar la opción "Línea de comandos" o "Comando inicial".

enter image description here

0 votos

Vaya, tendré que probar ese menú desde mi adb prompt.

0 votos

Nada relacionado con la pregunta del OP y adb

3voto

Ellen Wallace Puntos 6

Esta es una pregunta antigua, pero hace poco sentí curiosidad por esto. Encontré un método que no requiere recompilar adbd Sin embargo, requiere su (Estoy usando Chainfire SuperSu 2.45).

Suponiendo que bash se encuentra en /system/bin/bash y su está en /system/xbin/su Esencialmente es algo así:

  1. adb shell (utilice un shell interactivo. Invocar este proceso como un puede 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 rutas pueden ser diferentes; utilice which bash y which su para estar seguros.
  5. chmod 777 /system/bin/sh
  6. Prueba la cáscara antes de salir: /system/bin/sh . Si te da un error, corrige el error o revierte restaurando la copia de seguridad: cp /system/bin/sh.bak /system/bin/sh .
  7. Opcionalmente, vuelva a montar /system; la mayoría de los dispositivos lo harán automáticamente: mount -o remount,ro /system

Y ya está.

El simple enlace simbólico de BASH a SH no funciona porque bash emula a SH cuando es invocado de esta manera.

Sin embargo, echando un vistazo a strace, parece que busca un bashrc cuando se llama a un BASH simbolizado como 'sh --login'. Aunque esto podría utilizarse para "encadenar" shells a través de script, como se mencionó anteriormente la forma adbd invoca a SH está codificado.

Si hay un problema y ha eliminado (o movido) /system/bin/sh ADB no tendrá un intérprete de comandos para solucionar el problema. Si esto sucede, usted tiene algunas opciones:

  • Reiniciar en una recuperación que tiene adbd (como CWM o TWRP) y abrir un adb shell en él, para copiar /system/bin/sh.bak a /system/bin/sh de nuevo.
  • Utiliza 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.
  • Utilice un emulador de terminal que pueda ser configurado para ejecutar un shell diferente; tenga en cuenta que varios intentarán primero /system/bin/sh y forzarán el cierre.

1voto

Aleris Puntos 4674

Encontré la forma correcta y sencilla desde una caja Linux, incluso en 2021 y lineageos :

adb shell -t bash -i

Se conecta directamente a través de bash de forma interactiva.

Para no tener que recordar este comando todas las veces, yo personalmente uso un alias, simplemente añade esto a tu ~/.bashrc en la caja de Linux:

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

Entonces todo está configurado, simplemente ejecute

adb_shell

y disfrutar de todo bash características como la finalización de pestañas y todo lo demás. \o /

0voto

user301828 Puntos 31

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

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

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X