Làm cách nào để đặt bash làm shell mặc định?


10

Khi tôi quảng cáo vào một thiết bị có Cyanogenmod, tôi sẽ thấy một vỏ bash đẹp, dấu nhắc màu và bashrc. Tôi không thấy một liên kết tượng trưng từ / system / xbin / bash đến / system / bin / sh. Làm thế nào để họ đặt shell mặc định thành bash thay vì sh? Tôi đã xem qua các tập tin RC, nhưng không tìm thấy gì. Tôi muốn làm điều tương tự trên bản dựng Android của tôi, không phải là Cyanogenmod.

Cập nhật

Sau khi cài đặt lại từ đầu với CM7, tôi được đưa vào sh thay vì bash. Bây giờ câu hỏi là làm thế nào để đặt bash làm mặc định.


Vanilla CM7 (được xây dựng từ nguồn) thả tôi vào sh, không bash, khi tôi sử dụng adb để kết nối. Bạn đang sử dụng bản dựng nào?
eldarerathis

Đó là 7.1.0.1 cho Máy tính bảng ViewSonic G. Tôi đã không xây dựng từ các nguồn mặc dù.
Ravi

Câu trả lời:


7

Khi adb shellđược thực thi, phía Android cũng khởi chạy adb, sau đó thực thi /system/bin/sh -. Đường dẫn này được mã hóa cứng trong 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

Nếu bạn muốn thay đổi điều này thành bash, bạn sẽ phải biên dịch lại nó.

Có thể thực thi một số lệnh từ tệp khi chạy shell tương tác. Như được viết trong system/core/sh/main.c, sh -(lưu ý -chế độ tương tác) đọc từ các tệp sau (theo thứ tự này):

  • /etc/profile
  • .profile(liên quan đến thư mục hiện tại, đây là /.profilechoadb shell
  • $ENV(biến môi trường ENVnên trỏ đến một tệp)

/etc//chỉ đọc, cách duy nhất để tải thứ gì đó là cài đặt ENV. Bạn có thể có thể tạo một liên kết tượng trưng từ /etc/profileđến /data/profilebằng cách gắn /đọc-ghi (bài tập cho người đọc).


1
/ etc là một liên kết tượng trưng đến phân vùng / hệ thống. Tôi đã kể lại rằng đọc-ghi và thêm / etc / profile nhưng nó không được gọi bởi sh :(
Colin


3

Đây là một câu hỏi cũ, nhưng gần đây tôi đã tò mò về điều này. Tôi đã tìm thấy một phương pháp không yêu cầu biên dịch lại adbd, tuy nhiên nó yêu cầu su(Tôi đang sử dụng Chainfire SuperSu 2.45).

Giả sử bashđược đặt tại /system/bin/bash, và sutại /system/xbin/su, về cơ bản nó giống như thế này:

  1. adb shell (sử dụng lớp vỏ tương tác. Gọi quy trình này dưới dạng một lớp lót có thể khiến ADB ngừng hoạt động nếu có sự cố)
  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 Lưu ý rằng đường dẫn của bạn có thể khác nhau; sử dụng which bashwhich suđể chắc chắn
  5. chmod 777 /system/bin/sh
  6. Kiểm tra vỏ trước khi bạn thoát : /system/bin/sh. Nếu bạn gặp lỗi, hãy sửa lỗi hoặc hoàn nguyên bằng cách khôi phục bản sao lưu : cp /system/bin/sh.bak /system/bin/sh.
  7. Tùy chọn remount / hệ thống; hầu hết các thiết bị sẽ tự động làm điều này: mount -o remount,ro /system

Và bạn đã hoàn thành.

Chỉ đơn giản là liên kết BASH với SH không hoạt động vì bash mô phỏng SH khi được gọi theo cách này.

Tuy nhiên, có một cái nhìn về strace, nó dường như tìm kiếm bashrckhi một BASH liên kết được gọi là 'sh --login'. Mặc dù điều này có thể được sử dụng để "shellload" shell thông qua tập lệnh, như đã đề cập ở trên cách adbdgọi SH được mã hóa cứng.

Nếu có vấn đề và bạn đã gỡ bỏ (hoặc di chuyển) /system/bin/shADB sẽ không có vỏ để cung cấp cho bạn để khắc phục sự cố. Nếu điều này xảy ra, bạn có một vài lựa chọn:

  • Khởi động lại vào một phục hồi có adbd(như CWM hoặc TWRP) và mở một vỏ adb cho nó, để sao chép /system/bin/sh.bak qua / system / bin / sh một lần nữa.
  • Sử dụng adb để sao chép bản sao lưu: adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh Lưu ý rằng điều này sẽ không hoạt động trên tất cả các thiết bị; một số từ chối cho phép adb để giới thiệu / hệ thống rw theo cách này.
  • Sử dụng một trình giả lập thiết bị đầu cuối có thể được thiết lập để chạy một shell khác; lưu ý rằng một số sẽ thử / system / bin / sh trước và buộc đóng.

0

Trên PC của bạn, nhận nhị phân bash và ghi đè /system/bin/sh. Tôi có một cái ở đây .

Vui lòng sao chép mã này:

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   
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.