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

1.

开发调试者是一种窃喜,想怎么往里推文件,修改参数。但从最终用户来看,这是安全隐患。如何关闭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。否则属性修改无效。

修改后, 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"]

}

] 修改他,然后验证。root权限切换成功