डिफ़ॉल्ट शेल के रूप में बैश कैसे सेट करें?


10

जब मैं CyanogenMod के साथ एक डिवाइस में adb करता हूं, तो मुझे एक अच्छा bash शेल, कलर प्रॉम्प्ट और bashrc प्रस्तुत किया जाता है। मुझे / system / xbin / bash से / system / bin / sh से एक सिमलिंक दिखाई नहीं देता है। श के बजाए वे डिफॉल्ट शेल को कैसे सेट करते हैं? मैं आर सी फ़ाइलों के माध्यम से देखा, लेकिन कुछ भी नहीं मिला। मैं अपने Android बिल्ड पर वही करना चाहूंगा, जो Cyanogenmod नहीं है।

अपडेट करें

CM7 के साथ स्क्रैच से फिर से स्थापित करने के बाद, मैं बैश के बजाय श को ले जाया जाता हूं। अब सवाल यह है कि bash को डिफॉल्ट के रूप में कैसे सेट किया जाए।


वेनिला सीएम 7 (स्रोत से निर्मित) मुझे ड्रॉप करता है sh, न कि bashजब मैं कनेक्ट करने के लिए एडीबी का उपयोग करता हूं। आप किस निर्माण का उपयोग कर रहे हैं?
एल्डररैथिस

व्यूसोनिक जी टैबलेट के लिए यह 7.1.0.1 है। मैं हालांकि स्रोतों से निर्माण नहीं किया था।
रवि

जवाबों:


7

जब adb shellनिष्पादित किया जाता है, तो एंड्रॉइड साइड भी 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

यदि आप इसे bash में बदलना चाहते हैं, तो आपको इसे recompile करना होगा।

इंटरेक्टिव शेल चलाने पर फ़ाइल से कुछ कमांड निष्पादित करना संभव है। के रूप में में लिखा system/core/sh/main.c, sh -(ध्यान दें -इंटरैक्टिव मोड के लिए) (इस क्रम में) निम्न फ़ाइलों से पढ़ता है:

  • /etc/profile
  • .profile(वर्तमान निर्देशिका के सापेक्ष, यह है /.profileके लिएadb shell
  • $ENV(पर्यावरण चर ENVएक फ़ाइल को इंगित करना चाहिए)

जैसा कि /etc/और /केवल पढ़ने के लिए है, कुछ लोड करने का एकमात्र तरीका सेटिंग द्वारा था ENV। आप शायद से एक सिमलिंक बना सकते हैं /etc/profileकरने के लिए /data/profileबढ़ते द्वारा /पढ़ने-लिखने की (पाठक के लिए व्यायाम)।


1
/ etc / सिस्टम विभाजन के लिए एक सहानुभूति है। मैंने लिखा है कि पढ़ा-लिखा और जोड़ा / आदि / प्रोफ़ाइल लेकिन यह sh द्वारा बुलाया नहीं जाता है :(
कॉलिन

5

मेरे पास परीक्षण करने के लिए अभी मेरे पास मेरा Android नहीं था, लेकिन Android टर्मिनल एमुलेटर के साथ यदि आप मेनू पर जाते हैं, तो आप "कमांड लाइन" या "प्रारंभिक कमांड" विकल्प का उपयोग करने में सक्षम हो सकते हैं।

यहाँ छवि विवरण दर्ज करें


जी, मुझे अपने adb प्रॉम्प्ट से उस मेनू को आज़माना होगा।
mchid

3

यह एक पुराना सवाल है, लेकिन मैं हाल ही में इस बारे में खुद उत्सुक था। मुझे एक विधि मिली adbd, जिसमें पुन: जमा करने की आवश्यकता नहीं है , हालांकि इसकी आवश्यकता है su(मैं चेनफायर सुपरसु 2.45 का उपयोग कर रहा हूं)।

मान लिया जाये कि bashमें स्थित है /system/bin/bash, और suपर है /system/xbin/su, यह अनिवार्य रूप से कुछ इस तरह है:

  1. adb shell (एक इंटरैक्टिव शेल का उपयोग करें। एक-लाइनर के रूप में इस प्रक्रिया को आमंत्रित करना एडीबी का कारण बन सकता है अगर कोई समस्या है तो काम करना बंद कर देगा)
  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 सहानुभूति देना काम नहीं करता है क्योंकि इस तरह से आह्वान करने पर bash SH का अनुकरण करता है।

हालाँकि, bashrcस्ट्रेस को देखते हुए, यह देखने में प्रतीत होता है कि सिम्प्लेक्स किए गए BASH को 'sh --login' कहा जाता है। जबकि यह अवधारणा को स्क्रिप्ट के माध्यम से "चेनलोड" के गोले के लिए इस्तेमाल किया जा सकता है, जैसा कि adbdएसएच हार्डकोडेड है जिस तरह से ऊपर वर्णित है।

यदि कोई समस्या है और आपने /system/bin/shएडीबी को हटा दिया है (या स्थानांतरित कर दिया है) तो समस्या को ठीक करने के लिए आपको देने के लिए एक शेल है। यदि ऐसा होता है, तो आपके पास कुछ विकल्प हैं:

  • एक रिकवरी में रिबूट करें adbd(जैसे कि CWM या TWRP) और उसके पास एक adb खोल दें, ताकि /system/bin/sh.bak को / system / bin / sh पर फिर से कॉपी कर सकें।
  • बैकअप की प्रतिलिपि बनाने के लिए अदब का उपयोग करें: adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh ध्यान दें कि यह सभी उपकरणों पर काम नहीं करेगा; कुछ इस तरह से adb को remount / system rw को अनुमति देने से इंकार करते हैं।
  • एक टर्मिनल एमुलेटर का उपयोग करें जिसे एक अलग शेल चलाने के लिए सेट किया जा सकता है; ध्यान दें कि कई कोशिश करेंगे / प्रणाली / बिन / श पहले और बल करीब।

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   
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.