虽然鸿蒙系统对外宣传天然无Root,但只要是代码开发者,在使用hdc时,‘#’出现在你的面前,当然对于

开发调试者是一种窃喜,想怎么往里推文件,修改参数。但从最终用户来看,这是安全隐患。如何关闭root,切
换到shell用户呢,解决中…
解决思路:
1.参考Android init启动流程,参考对应的adb守护进程,发现在其中在启动流程中,切换了root
到shell。
static void drop_privileges(int server_port) {
if (should_drop_caps) {
minijail_use_caps(jail.get(), CAP_TO_MASK(CAP_SETUID) | CAP_TO_MASK(CAP_SETGID));
}

    minijail_change_gid(jail.get(), AID_SHELL);
    minijail_change_uid(jail.get(), AID_SHELL);
    // minijail_enter() will abort if any priv-dropping step fails.
    minijail_enter(jail.get());

}

2.查看鸿蒙系统hdcd代码,找到其代码git库 developtools/hdc_standard$

在hdc的进程里
void NeedDropPriv()
{
char droprootSet[BUF_SIZE_TINY] = “”;
Base::GetHdcProperty(“persist.hdc.root”, droprootSet, BUF_SIZE_TINY);
droprootSet[sizeof(droprootSet) - 1] = ‘\0’;
string rootMode = droprootSet;
if (Base::Trim(rootMode) == “1”) {
setuid(0);
g_rootRun = true;
WRITE_LOG(LOG_DEBUG, “Root run”);
} else if (Base::Trim(rootMode) == “0”) {
setuid(AID_SHELL);
setgid(AID_SHELL);
}
}
可以修改 persist.hdc.root参数,在init.cfg里,或编译param里,需要注意的是:
这个加入的位置要早,前于hdcd start。否则属性修改无效。

  1. 修改后, hdc shell, ‘$’,终于OK。但是你会发现另外的问题,hilog敲完后,使用不了,
    是不是很意外,报错error 13,Permission denied,权限问题。继续查看hilog代码,base/hiviewdfx/hilog,
    你会发现,在etc里sockect里没有配置对应的shell gid/uid,但修改后,并不能解决。所以鸿蒙系统还是很多坑,
    后面升级3.1,说可以修改,但未验证。

4.另外还有有一个root bug,你在使用uart debug log,是不是也是 “#”号,这个又是怎么回事,调试打印一个
log,还需要root权限,真是难以理解,查找代码,base/startup/init_lite, init.cfg 里有一个配置:
+++ b/services/etc/init.cfg
@@ -498,7 +498,7 @@
“path” : [“/system/bin/sh”],
“disabled” : 1,
“console” : 1,

       ***"uid" : "root",***
       "uid" : "shell",
       "gid" : ["shell", "log", "readproc"]
   }