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

10

Lorsque j'adb dans un appareil avec CyanogenMod, je suis présenté avec un joli shell bash, une invite de couleur et bashrc. Je ne vois pas de lien symbolique de / system / xbin / bash vers / system / bin / sh. Comment définissent-ils le shell par défaut sur bash au lieu de sh? J'ai parcouru les fichiers rc, mais je n'ai rien trouvé. J'aimerais faire la même chose sur ma version Android, qui n'est pas CyanogenMod.

Mettre à jour

Après avoir réinstallé à partir de zéro avec CM7, je suis amené à sh au lieu de bash. Maintenant, la question est de savoir comment définir bash par défaut.

Ravi
la source
Vanilla CM7 (construit à partir de la source) me dépose sh, non bash, lorsque j'utilise adb pour me connecter. Quelle version utilisez-vous?
eldarerathis
C'est 7.1.0.1 pour la tablette ViewSonic G. Mais je n'ai pas construit à partir de sources.
Ravi

Réponses:

7

Une fois adb shellexécuté, le côté Android lance également adb qui s'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 voulez changer cela en bash, vous devrez le recompiler.

Il est possible d'exécuter certaines commandes à partir d'un fichier lors de l'exécution du shell interactif. Tel qu'écrit system/core/sh/main.c, sh -(notez le -mode interactif) lit à partir des fichiers suivants (dans cet ordre):

  • /etc/profile
  • .profile(par rapport au répertoire courant, c'est /.profilepouradb shell
  • $ENV(la variable d'environnement ENVdoit pointer vers un fichier)

Comme /etc/et /sont en lecture seule, le seul moyen de charger quelque chose était de le paramétrer ENV. Vous pouvez probablement créer un lien symbolique de /etc/profileà /data/profileen montant en /lecture-écriture (exercice pour le lecteur).

Lekensteyn
la source
1
/ etc est un lien symbolique vers la partition / system. J'ai remonté cette lecture-écriture et ajouté / etc / profile mais il n'est pas appelé par sh :(
Colin
5

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

entrez la description de l'image ici

Lie Ryan
la source
Gee, je vais devoir essayer ce menu à partir de mon invite adb.
mchid
3

C'est une vieille question, mais j'étais moi-même récemment curieux à ce sujet. J'ai trouvé une méthode qui ne nécessite pas de recompilation adbd, mais elle en a besoin su(j'utilise Chainfire SuperSu 2.45).

En supposant que bashse trouve à /system/bin/bash, et suest à /system/xbin/su, c'est essentiellement quelque chose comme ceci:

  1. adb shell (utilisez un interpréteur de commandes interactif. L'invocation de ce processus en une seule ligne pourrait 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 peuvent différer; utiliser which bashet which supour être sûr.
  5. chmod 777 /system/bin/sh
  6. Testez la coquille avant de quitter: /system/bin/sh. Si vous obtenez une erreur, corriger l'erreur ou Revert par la restauration de la sauvegarde: cp /system/bin/sh.bak /system/bin/sh.
  7. Remontage / système en option; la plupart des appareils le feront automatiquement: mount -o remount,ro /system

Et tu as fini.

Le simple lien symbolique entre BASH et SH ne fonctionne pas car bash émule SH lorsqu'il est invoqué de cette façon.

Cependant, après avoir examiné strace, il semble rechercher un bashrclorsqu'un BASH lié par un lien symbolique est appelé «sh --login». Bien que cela puisse en théorie être utilisé pour "charger en chaîne" des shells via un script, comme mentionné ci-dessus, la façon dont adbdSH s'appelle est codée en dur.

S'il y a un problème et que vous avez supprimé (ou déplacé) /system/bin/shADB n'aura pas de shell pour vous permettre de résoudre le problème. Si cela se produit, vous avez quelques options:

  • Redémarrez dans une récupération qui a adbd(comme CWM ou TWRP) et ouvrez-y un shell adb pour copier /system/bin/sh.bak sur / system / bin / sh.
  • 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 de permettre à adb de remonter / système rw de cette manière.
  • Utilisez un émulateur de terminal qui peut être défini pour exécuter un autre shell; notez que plusieurs essaieront / system / bin / sh en premier et forceront la fermeture.
psyincerise
la source
0

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

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   
DarkProphet
la source