13 votes

Comment définir bash comme shell par défaut ?

Lorsque je me connecte par adb à un appareil équipé de Cyanogenmod, je vois apparaître un shell bash, un prompt de couleur et un bashrc. Je ne vois pas de lien symbolique entre /system/xbin/bash et /system/bin/sh. Comment définir l'interpréteur de commandes par défaut sur bash au lieu de sh ? J'ai regardé dans les fichiers rc, mais je n'ai rien trouvé. J'aimerais faire la même chose sur ma version d'Android, qui n'est pas Cyanogenmod.

Mise à jour

Après une réinstallation à partir de zéro avec CM7, je suis amené à utiliser sh au lieu de bash. La question est maintenant de savoir comment mettre bash par défaut.

8voto

Lekensteyn Points 1552

Quand adb shell est exécutée, la partie Android lance également adb qui exécute ensuite /system/bin/sh - . Ce chemin est codé en dur dans 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 vous souhaitez passer à bash, vous devrez le recompiler.

Il est possible d'exécuter certaines commandes à partir d'un fichier lors de l'exécution de l'interpréteur de commandes interactif. Comme l'indique le document system/core/sh/main.c , sh - (noter les - pour le mode interactif) lit les fichiers suivants (dans cet ordre) :

  • /etc/profile
  • .profile (par rapport au répertoire actuel, il s'agit de /.profile pour adb shell
  • $ENV (variable d'environnement ENV doit pointer vers un fichier)

En tant que /etc/ y / sont en lecture seule, la seule façon de charger quelque chose était de définir le paramètre ENV . Vous pouvez probablement créer un lien symbolique à partir de /etc/profile a /data/profile par le montage / lecture-écriture (exercice pour le lecteur).

4voto

Thej Points 655

Je n'avais pas mon Android avec moi en ce moment pour le tester, mais avec l'application Emulateur de terminal Android si vous allez dans le menu, vous pourrez peut-être utiliser l'option "Ligne de commande" ou "Commande initiale".

enter image description here

3voto

Ellen Wallace Points 11

Il s'agit d'une vieille question, mais je me suis récemment posé la question. J'ai trouvé une méthode qui ne nécessite pas de recompilation adbd Toutefois, elle nécessite su (J'utilise Chainfire SuperSu 2.45).

Assumer bash est situé à l'adresse suivante /system/bin/bash y su est à /system/xbin/su Il s'agit essentiellement de quelque chose comme ceci :

  1. adb shell (utiliser un shell interactif). L'invocation de ce processus en tant que peut entraîner l'arrêt du fonctionnement d'ADB en cas de problème)
  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 Notez que vos chemins d'accès peuvent être différents ; utilisez which bash y which su pour être sûr.
  5. chmod 777 /system/bin/sh
  6. Testez la coquille avant de la quitter : /system/bin/sh . Si vous obtenez une erreur, corrigez-la ou revenez en arrière en restaurant la sauvegarde : cp /system/bin/sh.bak /system/bin/sh .
  7. Remonter éventuellement /system ; la plupart des dispositifs le font automatiquement : mount -o remount,ro /system

Et le tour est joué.

L'établissement d'un lien symbolique entre BASH et SH ne fonctionne pas, car bash émule SH lorsqu'il est invoqué de cette manière.

Cependant, en jetant un coup d'œil à strace, il semble qu'il cherche un bashrc lorsqu'un BASH lié par un lien symbolique est appelé par 'sh --login'. Bien qu'il soit concevable d'utiliser cela pour "charger en chaîne" des shells via un script, comme mentionné ci-dessus, la façon dont adbd invoque SH est codé en dur.

S'il y a un problème et que vous avez supprimé (ou déplacé) /system/bin/sh ADB n'aura pas de shell à vous donner pour résoudre le problème. Dans ce cas, vous avez plusieurs options :

  • Redémarrer dans une récupération qui a adbd (comme CWM ou TWRP) et ouvrez un shell adb sur celui-ci, pour copier /system/bin/sh.bak vers /system/bin/sh à nouveau.
  • Utilisez adb pour copier la sauvegarde : adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh Notez que cela ne fonctionnera pas sur tous les appareils ; certains refusent d'autoriser adb à remonter /system rw de cette manière.
  • Utilisez un émulateur de terminal qui peut être configuré pour exécuter un autre shell ; notez que certains émulateurs essaieront d'abord /system/bin/sh et forceront la fermeture.

1voto

Aleris Points 4674

Trouvé la bonne et simple méthode à partir d'une boîte Linux, même en 2021 et en lignées :

adb shell -t bash -i

Vous vous connectez directement via bash de manière interactive.

Pour ne pas avoir à se souvenir de cette commande en permanence, j'ai personnellement personnellement, j'utilise un alias, ajoutez simplement ceci à votre ~/.bashrc sur une machine Linux :

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

Une fois que tout est configuré, il suffit de lancer

adb_shell

et profiter de tous les bash des fonctionnalités telles que l'achèvement des tabulations et autres. \o /

0voto

DarkProphet Points 1

Sur votre PC, obtenez un binaire bash et écrasez /system/bin/sh . J'en ai un aquí .

N'hésitez pas à copier ce code :

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

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X