Đâ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à su
tại /system/xbin/su
, về cơ bản nó giống như thế này:
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ố)
mount -o remount,rw /system
mv /system/bin/sh /system/bin/sh.bak
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 bash
và which su
để chắc chắn
chmod 777 /system/bin/sh
- 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
.
- 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 bashrc
khi 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 adbd
gọ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/sh
ADB 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.
sh
, khôngbash
, khi tôi sử dụng adb để kết nối. Bạn đang sử dụng bản dựng nào?