Wie setze ich Bash als Standard-Shell?

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.

Vanilla CM7 (aus der Quelle erstellt) lässt mich bei sh, nicht fallen bash, wenn ich adb zum Verbinden verwende. Welchen Build verwendest du?
Es ist 7.1.0.1 für das ViewSonic G Tablet. Ich habe allerdings nicht aus Quellen gebaut.

Antworten (5)

Wenn adb shellausgefü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 /.profilefüradb shell
  • $ENV(Umgebungsvariable ENVsollte 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/profilenach erstellen, /data/profileindem Sie /read-write mounten (Übung für den Leser).

/etc ist ein symbolischer Link zur /system-Partition. Ich habe diesen Lese-/Schreibzugriff erneut gemountet und /etc/profile hinzugefügt, aber er wird nicht von sh aufgerufen :(

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.

Geben Sie hier die Bildbeschreibung ein

Gee, ich muss dieses Menü von meiner Adb-Eingabeaufforderung aus ausprobieren.
Nichts im Zusammenhang mit OP-Frage undadb

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 bashbefindet sich unter /system/bin/bashund subefindet sich unter /system/xbin/su, ist es im Wesentlichen so:

  1. 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.)
  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/shBeachten Sie, dass sich Ihre Pfade unterscheiden können; verwenden which bashund which susicher sein.
  5. chmod 777 /system/bin/sh
  6. Testen Sie die Shell, bevor Sie sie beenden: /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.
  7. Optional remount /system; Die meisten Geräte tun dies automatisch: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, bashrcwenn 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 adbdSH aufgerufen wird, wie oben erwähnt, fest codiert.

Wenn es ein Problem gibt und Sie es entfernt (oder verschoben) /system/bin/shhaben, hat ADB keine Shell, die Ihnen zur Behebung des Problems zur Verfügung steht. In diesem Fall haben Sie mehrere Möglichkeiten:

  • Starten Sie in eine Wiederherstellung neu, die adbd(wie CWM oder TWRP) hat, und öffnen Sie eine ADB-Shell, um /system/bin/sh.bak erneut nach /system/bin/sh zu kopieren.
  • Verwenden Sie adb, um das Backup zu kopieren: adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/shBeachten Sie, dass dies nicht auf allen Geräten funktioniert; Einige weigern sich, adb zu erlauben, /system rw auf diese Weise neu zu mounten.
  • Verwenden Sie einen Terminalemulator, der so eingestellt werden kann, dass er eine andere Shell ausführt. Beachten Sie, dass einige zuerst /system/bin/sh versuchen und das Schließen erzwingen.

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 :

adb shell -t bash -i

Sie melden sich direkt über 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 ~/.bashrcLinux-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 bashFunktionen wie Tab-Vervollständigung und alles andere. \Ö/