Wenn ich mich mit Cyanogenmod an ein Gerät anschließe, werden mir eine schöne Bash-Shell, eine Farbaufforderung und ein Bashrc angezeigt. Ich sehe keinen Symlink von / system / xbin / bash zu / system / bin / sh. Wie setzen sie die Standard-Shell auf bash anstelle von sh? Ich habe die RC-Dateien durchgesehen, aber nichts gefunden. Ich möchte dasselbe auf meinem Android-Build tun, der nicht Cyanogenmod ist.
Aktualisieren
Nach der Neuinstallation mit CM7 werde ich zu sh anstatt zu bash gebracht. Nun stellt sich die Frage, wie Bash als Standard festgelegt wird.
cyanogenmod
bash
Ravi
quelle
quelle
sh
nicht fallenbash
, wenn ich adb zum Verbinden benutze. Welchen Build verwendest du?Antworten:
Wenn
adb shell
es ausgeführt wird, startet die Android-Seite auch adb, das dann ausgeführt wird/system/bin/sh -
. Dieser Pfad ist fest codiert insystem/core/adb/services.c
:Wenn Sie dies in bash ändern möchten, müssen Sie es neu kompilieren.
Es ist möglich, einige Befehle aus einer Datei auszuführen, wenn die interaktive Shell ausgeführt wird. Wie in geschrieben
system/core/sh/main.c
,sh -
(aus dem-
interaktiven Modus) liest aus den folgenden Dateien (in dieser Reihenfolge):/etc/profile
.profile
(relativ zum aktuellen Verzeichnis ist dies/.profile
füradb shell
$ENV
(UmgebungsvariableENV
sollte auf eine Datei zeigen)Da
/etc/
und/
sind schreibgeschützt, war die einzige Möglichkeit, etwas zu laden, die EinstellungENV
. Sie können wahrscheinlich einen Symlink von/etc/profile
bis erstellen ,/data/profile
indem Sie/
Lese- / Schreibzugriff aktivieren (Übung für den Leser).quelle
Ich hatte mein Android gerade nicht zum Testen dabei, aber mit dem Android Terminal Emulator können Sie möglicherweise die Option "Befehlszeile" oder "Anfangsbefehl" verwenden, wenn Sie zum Menü gehen.
quelle
Dies ist eine alte Frage, aber ich war kürzlich selbst neugierig darauf. Ich habe eine Methode gefunden, die nicht neu kompiliert werden muss
adbd
, jedoch erforderlich istsu
(ich verwende Chainfire SuperSu 2.45).Angenommen, es
bash
befindet sich bei/system/bin/bash
undsu
befindet sich im/system/xbin/su
Wesentlichen in etwa so:adb shell
(Verwenden Sie eine interaktive Shell. Wenn Sie diesen Prozess als Einzeiler aufrufen, kann dies dazu führen, dass ADB bei Problemen nicht mehr funktioniert.)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
Beachten Sie, dass Ihre Pfade unterschiedlich sein können. benutzewhich bash
undwhich su
um sicher zu sein.chmod 777 /system/bin/sh
/system/bin/sh
. Wenn Sie einen Fehler erhalten, beheben Sie den Fehler oder kehren Sie zurück, indem Sie die Sicherung wiederherstellen :cp /system/bin/sh.bak /system/bin/sh
.mount -o remount,ro /system
Und du bist fertig.
Das einfache Verknüpfen von BASH mit SH funktioniert nicht, da bash SH emuliert, wenn es auf diese Weise aufgerufen wird.
Wenn man sich jedoch strace ansieht, scheint es nach einem zu suchen,
bashrc
wenn ein symlinked BASH als 'sh - login' bezeichnet wird. Während dies möglicherweise verwendet werden könnte, um Shells per Skript zu "kettenladen", ist, wie oben erwähnt, die Art und Weise, wieadbd
SH aufgerufen wird, fest codiert.Wenn es ein Problem gibt und Sie
/system/bin/sh
ADB entfernt (oder verschoben) haben, verfügen Sie nicht über eine Shell, mit der Sie das Problem beheben können. In diesem Fall haben Sie einige Möglichkeiten:adbd
(z. B. CWM oder TWRP) neu und öffnen Sie eine ADB-Shell, um /system/bin/sh.bak erneut nach / system / bin / sh zu kopieren.adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh
Beachten Sie, dass dies nicht auf allen Geräten funktioniert. einige lehnen es ab, adb auf diese weise wieder zu montieren / system rw zu erlauben.quelle
Holen Sie sich auf Ihrem PC eine Bash-Binärdatei und überschreiben Sie diese
/system/bin/sh
. Ich habe einen hier .Fühlen Sie sich frei, diesen Code zu kopieren:
quelle