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 :
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)
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 d'accès peuvent être différents ; utilisez which bash
y which su
pour être sûr.
chmod 777 /system/bin/sh
- 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
.
- 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.