如何将bash设置为默认外壳?


10

当我使用Cyanogenmod进入设备时,会看到一个漂亮的bash shell,颜色提示和bashrc。我没有看到从/ system / xbin / bash到/ system / bin / sh的符号链接。他们如何将默认shell设置为bash而不是sh?我浏览了rc文件,但没有找到任何东西。我想在不是Cyanogenmod的Android版本上执行相同的操作。

更新资料

用CM7从头开始重新安装后,我被带到sh而不是bash。现在的问题是如何将bash设置为默认值。


当我使用adb进行连接时sh,Vanilla CM7(从源代码构建)将我放置在,而不是bash。您正在使用什么版本?
eldarerathis 2012年

ViewSonic G Tablet为7.1.0.1。我不是从源头构建的。
拉维

Answers:


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

如果要将其更改为bash,则必须重新编译。

运行交互式外壳程序时,可以从文件执行一些命令。如所写system/core/sh/main.csh -(请注意-用于交互方式)从以下文件中读取(按此顺序):

  • /etc/profile
  • .profile(相对于当前目录,这是/.profile针对adb shell
  • $ENV(环境变量ENV应指向文件)

由于/etc//是只读的,拿到装东西的唯一办法就是通过设置ENV。您可以通过安装读写(读者练习)/etc/profile来创建从到的符号链接。/data/profile/


1
/ etc是/ system分区的符号链接。我重新安装了该读写文件,并添加了/ etc / profile,但是sh却没有调用它:(
Colin


3

这是一个古老的问题,但我最近对此感到很好奇。我发现不需要重新编译的方法adbd,但是确实需要su(我正在使用Chainfire SuperSu 2.45)。

假设bash位于/system/bin/bashsu/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 bashwhich su确定。
  5. chmod 777 /system/bin/sh
  6. 在退出之前测试外壳:/system/bin/sh。如果遇到错误,请修复错误或通过还原备份来还原:cp /system/bin/sh.bak /system/bin/sh
  7. (可选)重新安装/ system;大多数设备会自动执行此操作: mount -o remount,ro /system

这样就完成了。

简单地将BASH符号链接到SH是行不通的,因为以这种方式调用bash会模仿SH。

但是,看看strace时,它似乎确实在寻找bashrc一个符号链接的BASH被称为“ sh --login”的情况。尽管可以想象这可以用来通过脚本“加载” shell,但是如上所述,adbd调用SH 的方式是硬编码的。

如果存在问题,并且您已卸下(或移走了)/system/bin/shADB,则不会有外壳来解决您的问题。如果发生这种情况,您有几种选择:

  • 重新启动进入具有adbd(例如CWM或TWRP)的恢复,并向其中打开adb shell,以将/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以这种方式重新安装/ system rw。
  • 使用可以设置为运行其他Shell的终端仿真器;请注意,有几个将首先尝试/ system / bin / sh并强制关闭。

0

在您的PC上,获取bash二进制文件并覆盖/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   
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.