Bash varsayılan kabuk olarak nasıl ayarlanır?


10

Cyanogenmod ile bir cihaza yapıştığımda, güzel bir bash kabuğu, renk istemi ve bashrc ile karşılaşıyorum. / System / xbin / bash ile / system / bin / sh arasında bir sembolik bağlantı görmüyorum. Varsayılan kabuğu sh yerine bash'a nasıl ayarlarlar? RC dosyalarına baktım ama hiçbir şey bulamadım. Aynı şeyi Cyanogenmod olmayan Android sürümümde de yapmak istiyorum.

Güncelleme

CM7 ile sıfırdan yeniden yükledikten sonra bash yerine sh'ye götürüldüm. Şimdi soru bash'ı varsayılan olarak nasıl ayarlayacağınızdır.


Bağlanmak için adb kullandığım zaman sh, vanilya CM7 (kaynaktan inşa edilmiş) beni düşürüyor bash. Hangi yapıyı kullanıyorsunuz?
eldarerathis

ViewSonic G Tablet için 7.1.0.1'dir. Yine de kaynaklardan inşa etmedim.
Ravi

Yanıtlar:


7

Ne zaman adb shellyürütüldüğünde, Android tarafı da başlattı hangi ardından yürütür ADB /system/bin/sh -. Bu yol sabit olarak kodlanmıştır 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

Bunu bash olarak değiştirmek isterseniz, yeniden derlemeniz gerekir.

Etkileşimli kabuğu çalıştırırken dosyadan bazı komutları yürütmek mümkündür. Yazılı olarak system/core/sh/main.c, sh -(not -interaktif mod için) (bu sırayla) aşağıdaki dosyalardan okur:

  • /etc/profile
  • .profile(geçerli dizine göre, bu /.profileiçinadb shell
  • $ENV(ortam değişkeni ENVbir dosyayı göstermelidir)

Olarak /etc/ve /salt okunur, bir şey yüklenmesinin tek yolu ayarlamak oldu ENV. Muhtemelen bir sembolik oluşturabilir /etc/profileiçin /data/profilemontaj yoluyla /okuma-yazma (okuyucu için egzersiz).


1
/ etc, / system bölümüne bir sembolik bağlantıdır. Bu okuma-yazma ve / etc / profili ekledi ama sh :(
Colin


3

Bu eski bir soru, ama son zamanlarda bunu kendim merak ettim. Yeniden derleme gerektirmeyen bir yöntem buldum adbd, ancak gerektiriyor su(Chainfire SuperSu 2.45 kullanıyorum).

Aslında bunun böyle bir şeyde bashbulunduğu /system/bin/bashve suolduğu varsayılmaktadır /system/xbin/su:

  1. adb shell (etkileşimli bir kabuk kullanın. Bu işlemi bir astar olarak çağırmak, bir sorun varsa ADB'nin çalışmayı durdurmasına neden olabilir)
  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 Yollarınızın farklı olabileceğini unutmayın; which bashve which suemin olmak için kullanın .
  5. chmod 777 /system/bin/sh
  6. Eğer çıkmadan önce kabuğunu test edin: /system/bin/sh. Eğer bir hata alırsanız, yedeği geri yükleyerek hata veya geri alma düzeltmek: cp /system/bin/sh.bak /system/bin/sh.
  7. İsteğe bağlı olarak yeniden montaj / sistem; çoğu cihaz bunu otomatik olarak yapar: mount -o remount,ro /system

Ve işiniz bitti.

BASH to SH sembolizasyonu işe yaramaz çünkü bash bu şekilde çağrıldığında SH'yi öykünür.

Bununla birlikte, strace'ye bakıldığında, sembolik bashrcbir BASH 'sh --login' olarak adlandırıldığında bir zaman gibi görünüyor . Bu, SH'nin çağrılma şeklinin sabit kodlandığı gibi, kodlama yoluyla kabukları "zincirle doldurmak" için akla yatkın olarak kullanılabilir adbd.

Bir sorun varsa ve kaldırıldı (veya taşındı) /system/bin/shADB sorunu düzeltmek için vermek için bir kabuk alışkanlık. Bu durumda, birkaç seçeneğiniz vardır:

  • adbd/System/bin/sh.bak dosyasını tekrar / system / bin / sh dizinine kopyalamak için (CWM veya TWRP gibi) bir kurtarma işlemine yeniden başlayın ve buna bir adb kabuğu açın.
  • Yedeklemeyi kopyalamak için adb'yi kullanın: adb root; adb remount; adb shell; adb pull /system/bin/sh.bak; adb push sh.bak /system/bin/sh Bunun tüm cihazlarda çalışmadığını unutmayın; bazıları adb'nin bu şekilde yeniden monte edilmesine / sistem rw'sine izin vermez.
  • Farklı bir kabuk çalıştıracak şekilde ayarlanabilen bir terminal emülatörü kullanın; birkaçının önce / system / bin / sh komutunu deneyeceğini ve kapanmaya zorlayacağını unutmayın.

0

PC'nizde bir bash ikili dosyası alın ve üzerine yazın /system/bin/sh. Burada bir tane var .

Bu kodu kopyalamaktan çekinmeyin:

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   
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.