Wie setze ich Bash als Standard-Shell?

10

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.

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

Antworten:

7

Wenn adb shelles ausgeführt wird, startet die Android-Seite auch adb, das 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 -(aus dem -interaktiven Modus) liest aus den folgenden Dateien (in dieser Reihenfolge):

  • /etc/profile
  • .profile(relativ zum aktuellen Verzeichnis ist dies /.profilefüradb shell
  • $ENV(Umgebungsvariable ENVsollte auf eine Datei zeigen)

Da /etc/und /sind schreibgeschützt, war die einzige Möglichkeit, etwas zu laden, die Einstellung ENV. Sie können wahrscheinlich einen Symlink von /etc/profilebis erstellen , /data/profileindem Sie /Lese- / Schreibzugriff aktivieren (Übung für den Leser).

Lekensteyn
quelle
1
/ etc ist ein Symlink zur / system-Partition. Ich habe das Lesen-Schreiben wieder montiert und / etc / profile hinzugefügt, aber es wird nicht von sh aufgerufen :(
Colin
5

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.

Geben Sie hier die Bildbeschreibung ein

Lie Ryan
quelle
Ich muss dieses Menü über meine ADB-Eingabeaufforderung ausprobieren.
Mchid
3

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 ist su(ich verwende Chainfire SuperSu 2.45).

Angenommen, es bashbefindet sich bei /system/bin/bashund subefindet sich im /system/xbin/suWesentlichen in etwa so:

  1. 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.)
  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/sh Beachten Sie, dass Ihre Pfade unterschiedlich sein können. benutze which bashund which suum sicher zu sein.
  5. chmod 777 /system/bin/sh
  6. Testen Sie die Shell, bevor 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 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, bashrcwenn 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, wie adbdSH aufgerufen wird, fest codiert.

Wenn es ein Problem gibt und Sie /system/bin/shADB 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:

  • Starten Sie eine Wiederherstellung mit 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.
  • 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/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.
  • Verwenden Sie einen Terminalemulator, der so eingestellt werden kann, dass eine andere Shell ausgeführt wird. Beachten Sie, dass mehrere zuerst / system / bin / sh versuchen und das Schließen erzwingen.
Psyincerise
quelle
0

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:

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   
DarkProphet
quelle