วิธีการตั้งค่าทุบตีเป็นเปลือกเริ่มต้น?


10

เมื่อฉัน adb เป็นอุปกรณ์ที่มี Cyanogenmod ฉันนำเสนอด้วยเปลือกทุบตีที่ดีพร้อมท์สีและ bashrc ฉันไม่เห็น symlink จาก / system / xbin / bash ถึง / system / bin / sh พวกเขาตั้งเปลือกเริ่มต้นเป็นทุบตีแทน sh ได้อย่างไร ฉันดูไฟล์ rc แต่ไม่พบอะไรเลย ฉันต้องการทำสิ่งเดียวกันบนบิลด์ Android ของฉันซึ่งไม่ใช่ Cyanogenmod

ปรับปรุง

หลังจากติดตั้งใหม่ตั้งแต่เริ่มต้นด้วย CM7 ฉันถูกพาไปที่ sh แทนการทุบตี ตอนนี้คำถามคือวิธีการตั้งค่าทุบตีเป็นค่าเริ่มต้น


วานิลลา CM7 (บิวด์จากแหล่งที่มา) หยดฉันที่shไม่ใช่bashเมื่อฉันใช้ adb เพื่อเชื่อมต่อ คุณกำลังสร้างสิ่งใด
eldarerathis

นี่คือ 7.1.0.1 สำหรับแท็บเล็ต ViewSonic G ฉันไม่ได้สร้างจากแหล่งที่มา
ราวี

คำตอบ:


7

เมื่อadb shellถูกดำเนินการด้าน Android นอกจากนี้ยังเปิดตัว adb /system/bin/sh -แล้วรัน เส้นทางนี้เขียนโค้ดแบบยากใน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

หากคุณต้องการเปลี่ยนสิ่งนี้เป็นทุบตีคุณจะต้องคอมไพล์ใหม่อีกครั้ง

เป็นไปได้ที่จะรันคำสั่งบางอย่างจากไฟล์เมื่อรันเชลล์แบบโต้ตอบ ตามที่เขียนไว้ในsystem/core/sh/main.c, sh -(หมายเหตุ-สำหรับโหมดโต้ตอบ) อ่านจากไฟล์ต่อไปนี้ (ในลำดับนี้):

  • /etc/profile
  • .profile(เทียบกับไดเรกทอรีปัจจุบันนี้มี/.profileไว้สำหรับadb shell
  • $ENV(ตัวแปรสภาพแวดล้อมENVควรชี้ไปที่ไฟล์)

ในฐานะที่เป็น/etc/และจะอ่านอย่างเดียววิธีเดียวที่จะได้รับสิ่งที่โหลดโดยการตั้งค่า/ ENVคุณสามารถสร้าง symlink ได้จาก/etc/profileไปที่/data/profileโดยติดตั้ง/อ่าน - เขียน (แบบฝึกหัดสำหรับผู้อ่าน)


1
/ etc เป็น symlink ไปยัง / system partition ฉันเล่าใหม่ว่าอ่าน - เขียนและเพิ่ม / etc / profile แต่มันไม่ได้ถูกเรียกโดย sh :(
Colin

5

ฉันไม่ได้มี Android กับฉันในตอนนี้เพื่อทำการทดสอบ แต่ด้วยAndroid Terminal Emulatorถ้าคุณไปที่เมนูคุณอาจจะสามารถใช้ตัวเลือก "Command Line" หรือ "Initial command"

ป้อนคำอธิบายรูปภาพที่นี่


Gee ฉันจะต้องลองเมนูนั้นจากพรอมต์ adb ของฉัน
mchid

3

นี่เป็นคำถามเก่า แต่เมื่อเร็ว ๆ นี้ฉันอยากรู้เกี่ยวกับตัวเอง ฉันพบวิธีการที่ไม่ต้องทำการคอมไพล์ใหม่adbdแต่มันไม่จำเป็นต้องใช้su(ฉันใช้ Chainfire SuperSu 2.45)

ทะลึ่งbashตั้งอยู่ที่/system/bin/bashและsuอยู่ที่/system/xbin/suมันเป็นหลักบางอย่างเช่นนี้:

  1. adb shell (ใช้เชลล์แบบโต้ตอบการเรียกใช้กระบวนการนี้เนื่องจากซับแบบหนึ่งอาจทำให้ ADB หยุดทำงานหากมีปัญหา)
  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 โปรดทราบว่าเส้นทางของคุณอาจแตกต่างกัน ใช้which bashและwhich suเพื่อให้แน่ใจว่า
  5. chmod 777 /system/bin/sh
  6. /system/bin/shทดสอบเปลือกก่อนที่คุณจะออกจาก: cp /system/bin/sh.bak /system/bin/shถ้าคุณได้รับข้อผิดพลาดแก้ไขข้อผิดพลาดหรือย้อนกลับด้วยการคืนสำรอง:
  7. เลือกใหม่ / ระบบ อุปกรณ์ส่วนใหญ่จะทำสิ่งนี้โดยอัตโนมัติ: mount -o remount,ro /system

และคุณทำเสร็จแล้ว

เพียงแค่เชื่อมโยง BASH เข้ากับ SH ไม่ทำงานเนื่องจากทุบตีเลียนแบบ SH เมื่อเรียกใช้ด้วยวิธีนี้

อย่างไรก็ตามเมื่อดูที่ strace ดูเหมือนจะมองหาbashrcเมื่อ BASH symlinked ถูกเรียกว่า 'sh --login' ในขณะที่สิ่งนี้สามารถใช้กับกระสุน "chainload" ผ่านสคริปต์ได้ดังที่ได้กล่าวมาแล้วข้างต้นวิธีที่adbdSH เรียกใช้คือ hardcoded

หากมีปัญหาและคุณได้ลบ (หรือย้าย) /system/bin/shADB จะไม่มีเชลล์เพื่อให้คุณแก้ไขปัญหา หากสิ่งนี้เกิดขึ้นคุณมีตัวเลือกน้อย:

  • รีบูตเข้าสู่การกู้คืนที่มีadbd(เช่น CWM หรือ TWRP) และเปิดเชลล์ adb ลงไปเพื่อคัดลอก /system/bin/sh.bak ไปยัง / system / bin / sh อีกครั้ง
  • ใช้ adb เพื่อคัดลอกข้อมูลสำรอง: adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh โปรดทราบว่านี่จะไม่ทำงานในอุปกรณ์ทั้งหมด บางคนปฏิเสธที่จะอนุญาตให้ adb เพื่อ remount / system rw ด้วยวิธีนี้
  • ใช้เทอร์มินัลอีมูเลเตอร์ที่สามารถตั้งค่าให้รันเชลล์ที่แตกต่างกัน โปรดทราบว่าหลายคนจะลอง / system / bin / sh ก่อนแล้วบังคับปิด

0

/system/bin/shในเครื่องคอมพิวเตอร์ของคุณได้รับทุบตีไบนารีและเขียนทับ ฉันมีหนึ่งที่นี่

อย่าลังเลที่จะคัดลอกรหัสนี้:

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   
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.