Bagaimana cara mengatur bash sebagai shell default?

10

Ketika saya adb ke perangkat dengan Cyanogenmod, saya disajikan dengan shell bash yang bagus, color prompt, dan bashrc. Saya tidak melihat symlink dari / system / xbin / bash ke / system / bin / sh. Bagaimana mereka mengatur shell default ke bash, bukan sh? Saya melihat-lihat file rc, tetapi tidak menemukan apa pun. Saya ingin melakukan hal yang sama di Android build saya, yang bukan Cyanogenmod.

Memperbarui

Setelah menginstal ulang dari awal dengan CM7, saya dibawa ke sh bukannya bash. Sekarang pertanyaannya adalah bagaimana mengatur bash sebagai default.

Ravi
sumber
Vanilla CM7 (dibangun dari sumber) menjatuhkan saya pada sh, tidak bash, ketika saya menggunakan adb untuk menghubungkan. Membangun apa yang Anda gunakan?
eldarerathis
Ini 7.1.0.1 untuk Tablet ViewSonic G. Saya tidak membangun dari sumber.
Ravi

Jawaban:

7

Saat adb shelldijalankan, sisi Android juga meluncurkan adb yang kemudian dijalankan /system/bin/sh -. Jalur ini dikode dalam 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

Jika Anda ingin mengubahnya menjadi bash, Anda harus mengkompilasi ulang.

Dimungkinkan untuk menjalankan beberapa perintah dari file saat menjalankan shell interaktif. Seperti yang ditulis system/core/sh/main.c, sh -(perhatikan -untuk mode interaktif) membaca dari file-file berikut (dalam urutan ini):

  • /etc/profile
  • .profile(relatif terhadap direktori saat ini, ini /.profileuntukadb shell
  • $ENV(variabel lingkungan ENVharus mengarah ke file)

Sebagai /etc/dan /hanya-baca, satu-satunya cara untuk mendapatkan sesuatu dimuat adalah dengan menetapkan ENV. Anda mungkin dapat membuat symlink dari /etc/profileke /data/profiledengan memasang /baca-tulis (latihan untuk pembaca).

Lekensteyn
sumber
1
/ etc adalah symlink ke partisi / sistem. Saya menulis ulang read-write dan menambahkan / etc / profile tetapi tidak dipanggil oleh sh :(
Colin
5

Saya tidak memiliki Android saya untuk diuji sekarang, tetapi dengan Android Terminal Emulator jika Anda masuk ke menu, Anda mungkin dapat menggunakan opsi "Command line" atau "Initial command".

masukkan deskripsi gambar di sini

Lie Ryan
sumber
Astaga, saya harus mencoba menu itu dari adb prompt saya.
mchid
3

Ini adalah pertanyaan lama, tetapi saya sendiri baru-baru ini ingin tahu tentang ini. Saya menemukan metode yang tidak memerlukan kompilasi ulang adbd, tetapi itu memang membutuhkan su(Saya menggunakan Chainfire SuperSu 2.45).

Dengan asumsi bashterletak di /system/bin/bash, dan sudi /system/xbin/su, pada dasarnya sesuatu seperti ini:

  1. adb shell (gunakan shell interaktif. Menggunakan proses ini sebagai one-liner dapat menyebabkan ADB berhenti bekerja jika ada masalah)
  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 Perhatikan bahwa jalur Anda mungkin berbeda; gunakan which bashdan which suuntuk memastikan.
  5. chmod 777 /system/bin/sh
  6. Menguji shell sebelum Anda keluar: /system/bin/sh. Jika Anda mendapatkan error, memperbaiki kesalahan atau revert dengan mengembalikan cadangan: cp /system/bin/sh.bak /system/bin/sh.
  7. Opsional remount / sistem; sebagian besar perangkat akan melakukan ini secara otomatis: mount -o remount,ro /system

Dan kamu sudah selesai.

Cukup dengan menghubungkan BASH ke SH tidak berfungsi karena bash mengemulasi SH ketika dipanggil dengan cara ini.

Namun, setelah melihat strace, sepertinya mencari bashrcketika BASH yang disatukan disebut sebagai 'sh --login'. Meskipun hal ini bisa digunakan untuk "chainload" shell melalui skrip, seperti yang disebutkan di atas cara adbdmemanggil SH adalah hardcode.

Jika ada masalah dan Anda telah menghapus (atau pindah) /system/bin/shADB tidak akan memiliki shell untuk memberi Anda memperbaiki masalahnya. Jika ini terjadi, Anda memiliki beberapa opsi:

  • Reboot ke pemulihan yang memiliki adbd(seperti CWM atau TWRP) dan buka adb shell untuk itu, untuk menyalin /system/bin/sh.bak lagi ke / system / bin / sh.
  • Gunakan adb untuk menyalin cadangan: adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh Perhatikan bahwa ini tidak akan berfungsi pada semua perangkat; beberapa menolak untuk mengizinkan adb melakukan remount / sistem rw dengan cara ini.
  • Gunakan emulator terminal yang dapat diatur untuk menjalankan shell yang berbeda; perhatikan bahwa beberapa akan mencoba / system / bin / sh terlebih dahulu dan tutup paksa.
psincincise
sumber
0

Di PC Anda, dapatkan bash binary dan timpa /system/bin/sh. Saya punya satu di sini .

Silakan menyalin kode ini:

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
sumber