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.
cyanogenmod
bash
Ravi
la source
la source
sh
, nonbash
, lorsque j'utilise adb pour me connecter. Quelle version utilisez-vous?Réponses:
Une fois
adb shell
exécuté, le côté Android lance également adb qui s'exécute ensuite/system/bin/sh -
. Ce chemin est codé en dur danssystem/core/adb/services.c
: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/.profile
pouradb shell
$ENV
(la variable d'environnementENV
doit pointer vers un fichier)Comme
/etc/
et/
sont en lecture seule, le seul moyen de charger quelque chose était de le paramétrerENV
. Vous pouvez probablement créer un lien symbolique de/etc/profile
à/data/profile
en montant en/
lecture-écriture (exercice pour le lecteur).la source
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".
la source
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 besoinsu
(j'utilise Chainfire SuperSu 2.45).En supposant que
bash
se trouve à/system/bin/bash
, etsu
est à/system/xbin/su
, c'est essentiellement quelque chose comme ceci: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)mount -o remount,rw /system
mv /system/bin/sh /system/bin/sh.bak
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; utiliserwhich bash
etwhich su
pour être sûr.chmod 777 /system/bin/sh
/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
.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
bashrc
lorsqu'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 dontadbd
SH s'appelle est codée 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 pour vous permettre de résoudre le problème. Si cela se produit, vous avez quelques options:adbd
(comme CWM ou TWRP) et ouvrez-y un shell adb pour copier /system/bin/sh.bak sur / system / bin / sh.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.la source
Sur votre PC, obtenez un binaire bash et écrasez
/system/bin/sh
. J'en ai un ici .N'hésitez pas à copier ce code:
la source