Come impostare bash come shell predefinita?


10

Quando mi inserisco in un dispositivo con Cyanogenmod, mi viene presentato con una bella shell bash, prompt dei colori e bashrc. Non vedo un link simbolico da / system / xbin / bash a / system / bin / sh. Come impostano la shell predefinita su bash invece di sh? Ho guardato attraverso i file rc, ma non ho trovato nulla. Vorrei fare lo stesso con la mia build Android, che non è Cyanogenmod.

Aggiornare

Dopo aver reinstallato da zero con CM7, vengo portato a sh anziché bash. Ora la domanda è come impostare bash come predefinito.


Vanilla CM7 (costruito dal sorgente) shnon bashmi lascia cadere quando non uso adb per connettermi. Che build stai usando?
eldarerathis,

È 7.1.0.1 per ViewSonic G Tablet. Non ho creato da fonti però.
Ravi,

Risposte:


7

Quando adb shellviene eseguito, anche il lato Android avvia adb che quindi viene eseguito /system/bin/sh -. Questo percorso è codificato 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

Se vuoi cambiarlo in bash, dovrai ricompilarlo.

È possibile eseguire alcuni comandi dal file quando si esegue la shell interattiva. Come scritto in system/core/sh/main.c, sh -(nota -per la modalità interattiva) legge dai seguenti file (in questo ordine):

  • /etc/profile
  • .profile(rispetto alla directory corrente, questo è /.profileperadb shell
  • $ENV(la variabile di ambiente ENVdovrebbe puntare a un file)

Dato /etc/che /sono di sola lettura, l'unico modo per caricare qualcosa era l'impostazione ENV. Probabilmente puoi creare un collegamento simbolico da /etc/profilea /data/profilemontando /read-write (esercizio per il lettore).


1
/ etc è un collegamento simbolico alla partizione / system. Ho rimontato quel read-write e ho aggiunto / etc / profile ma non viene chiamato da sh :(
Colin,

5

Non avevo il mio Android con me in questo momento per testare, ma con l' emulatore di terminale Android se vai al menu, potresti essere in grado di utilizzare l'opzione "Riga di comando" o "Comando iniziale".

inserisci qui la descrizione dell'immagine


Accidenti, dovrò provare quel menu dal mio prompt adb.
mchid

3

Questa è una vecchia domanda, ma recentemente ero curioso di questo. Ho trovato un metodo che non richiede la ricompilazione adbd, tuttavia è necessario su(sto usando Chainfire SuperSu 2.45).

Supponendo che bashsi trovi in /system/bin/bash, ed suè in /system/xbin/su, è essenzialmente qualcosa del genere:

  1. adb shell (utilizzare una shell interattiva. Richiamare questo processo come un liner potrebbe causare l'interruzione dell'ADB in caso di problemi)
  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 Nota che i tuoi percorsi potrebbero differire; usare which bashe which super essere sicuri.
  5. chmod 777 /system/bin/sh
  6. Testare il guscio prima di uscire: /system/bin/sh. Se si verifica un errore, correggere l'errore o ripristinare ripristinando il backup: cp /system/bin/sh.bak /system/bin/sh.
  7. Rimontaggio / sistema facoltativo; la maggior parte dei dispositivi lo farà automaticamente: mount -o remount,ro /system

E hai finito.

Il semplice collegamento simbolico di BASH a SH non funziona perché bash emula SH quando viene invocato in questo modo.

Tuttavia, bashrcdando un'occhiata a strace, sembra cercare un quando un BASH con collegamento simbolico viene chiamato 'sh --login'. Mentre questo potrebbe essere plausibilmente usato per "caricare a catena" shell tramite script, come menzionato sopra il modo in cui adbdinvoca SH è hardcoded.

Se c'è un problema e hai rimosso (o spostato) /system/bin/shADB non avrai una shell per darti una soluzione. In questo caso, hai alcune opzioni:

  • Riavvia in un ripristino che ha adbd(come CWM o TWRP) e apri una shell adb su di esso, per copiare /system/bin/sh.bak su / system / bin / sh di nuovo.
  • Usa adb per copiare il backup: adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh nota che non funzionerà su tutti i dispositivi; alcuni si rifiutano di consentire ad adb di rimontare / rw di sistema in questo modo.
  • Utilizzare un emulatore di terminale che può essere impostato per eseguire una shell diversa; nota che molti proveranno prima / system / bin / sh e forzeranno la chiusura.

0

Sul tuo PC, scarica un binario bash e sovrascrivi /system/bin/sh. Ne ho uno qui .

Sentiti libero di copiare questo codice:

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   
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.