Answers:
当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.c
,sh -
(请注意-
用于交互方式)从以下文件中读取(按此顺序):
/etc/profile
.profile
(相对于当前目录,这是/.profile
针对adb shell
$ENV
(环境变量ENV
应指向文件)由于/etc/
和/
是只读的,拿到装东西的唯一办法就是通过设置ENV
。您可以通过安装读写(读者练习)/etc/profile
来创建从到的符号链接。/data/profile
/
我现在没有要测试的Android设备,但是如果使用Android Terminal Emulator进入菜单,则可以使用“命令行”或“初始命令”选项。
这是一个古老的问题,但我最近对此感到很好奇。我发现不需要重新编译的方法adbd
,但是确实需要su
(我正在使用Chainfire SuperSu 2.45)。
假设bash
位于/system/bin/bash
和su
处/system/xbin/su
,本质上是这样的:
adb shell
(使用交互式外壳程序。以单线方式调用此过程可能会导致亚行在出现问题时停止工作)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
请注意,您的路径可能会有所不同。使用which bash
并which su
确定。chmod 777 /system/bin/sh
/system/bin/sh
。如果遇到错误,请修复错误或通过还原备份来还原:cp /system/bin/sh.bak /system/bin/sh
。mount -o remount,ro /system
这样就完成了。
简单地将BASH符号链接到SH是行不通的,因为以这种方式调用bash会模仿SH。
但是,看看strace时,它似乎确实在寻找bashrc
一个符号链接的BASH被称为“ sh --login”的情况。尽管可以想象这可以用来通过脚本“加载” shell,但是如上所述,adbd
调用SH 的方式是硬编码的。
如果存在问题,并且您已卸下(或移走了)/system/bin/sh
ADB,则不会有外壳来解决您的问题。如果发生这种情况,您有几种选择:
adbd
(例如CWM或TWRP)的恢复,并向其中打开adb shell,以将/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以这种方式重新安装/ system rw。在您的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
sh
,Vanilla CM7(从源代码构建)将我放置在,而不是bash
。您正在使用什么版本?