Wenn ich mit Cyanogenmod in ein Gerät adb, werde ich mit einer netten Bash-Shell, einer Farbeingabeaufforderung und bashrc konfrontiert. Ich sehe keinen symbolischen Link von /system/xbin/bash zu /system/bin/sh. Wie stellen sie die Standard-Shell auf bash statt sh ein? 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 von Grund auf mit CM7 werde ich zu sh anstelle von bash weitergeleitet. Nun stellt sich die Frage, wie man bash als Standard setzt.
Wenn adb shell
ausgeführt wird, startet die Android-Seite auch adb, die dann ausgeführt wird /system/bin/sh -
. Dieser Pfad ist fest codiert in 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
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 -
(beachten Sie die -
für den interaktiven Modus) liest aus den folgenden Dateien (in dieser Reihenfolge):
/etc/profile
.profile
(relativ zum aktuellen Verzeichnis, dies ist /.profile
füradb shell
$ENV
(Umgebungsvariable ENV
sollte auf eine Datei zeigen)Da /etc/
und /
schreibgeschützt sind, war die einzige Möglichkeit, etwas zu laden, die Einstellung von ENV
. Sie können wahrscheinlich einen Symlink von /etc/profile
nach erstellen, /data/profile
indem Sie /
read-write mounten (Übung für den Leser).
Ich hatte mein Android gerade nicht zum Testen dabei, aber mit dem Android Terminal Emulator , wenn Sie zum Menü gehen, können Sie möglicherweise die Option "Befehlszeile" oder "Anfangsbefehl" verwenden.
adb
Dies ist eine alte Frage, aber ich war kürzlich selbst neugierig darauf. Ich habe eine Methode gefunden, die keine Neukompilierung erfordert adbd
, jedoch su
(ich verwende Chainfire SuperSu 2.45).
Angenommen , es bash
befindet sich unter /system/bin/bash
und su
befindet sich unter /system/xbin/su
, ist es im Wesentlichen so:
adb shell
(Verwenden Sie eine interaktive Shell. Das Aufrufen dieses Prozesses als Einzeiler kann dazu führen, dass ADB bei einem Problem 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 sich Ihre Pfade unterscheiden können; verwenden which bash
und which su
sicher 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 symbolische Verlinken 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 eine symbolisch verknüpfte BASH als „sh --login“ aufgerufen wird. Während dies möglicherweise zum "Kettenladen" von Shells über Skript verwendet werden könnte, ist die Art und Weise, wie adbd
SH aufgerufen wird, wie oben erwähnt, fest codiert.
Wenn es ein Problem gibt und Sie es entfernt (oder verschoben) /system/bin/sh
haben, hat ADB keine Shell, die Ihnen zur Behebung des Problems zur Verfügung steht. In diesem Fall haben Sie mehrere Möglichkeiten:
adbd
(wie CWM oder TWRP) hat, 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 weigern sich, adb zu erlauben, /system rw auf diese Weise neu zu mounten.Holen Sie sich auf Ihrem PC eine Bash-Binärdatei und überschreiben Sie /system/bin/sh
. Ich habe hier eine .
Sie können diesen Code gerne kopieren:
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
Den richtigen & einfachen Weg aus einer Linux-Box gefunden, auch in 2021 und Lineageos :
adb shell -t bash -i
Sie melden sich direkt über Bash auf interaktive Weise an.
Um mir diesen Befehl nicht ständig merken zu müssen, verwende ich persönlich einen Alias, fügen Sie diesen einfach zu Ihrer ~/.bashrc
Linux-Box hinzu:
alias adb_shell='adb shell -t bash -i'
source ~/.bashrc
Dann ist alles konfiguriert, einfach ausführen
adb_shell
und genießen Sie alle bash
Funktionen wie Tab-Vervollständigung und alles andere. \Ö/
Eldarerathis
sh
, nicht fallenbash
, wenn ich adb zum Verbinden verwende. Welchen Build verwendest du?Ravi