Android与Linux中从uid到用户名的映射
整理自Android 从uid到用户名的映射分析理解 /etc/passwd 文件 /etc/passwd 文件是系统的主要文件之一。该文件中包含了所有用户登录名清单;为所有用户指定了主目录;在登录时使用的 shell 程序名称等。该文件还保存了用户口令;给每个用户提供系统识别号。/etc/passwd 文件是一个纯文本文件,每行采用了相同的格式:name:pa
整理自
/etc/passwd 文件是系统的主要文件之一。该文件中包含了所有用户登录名清单;为所有用户指定了主目录;在登录时使用的 shell 程序名称等。该文件还保存了用户口令;给每个用户提供系统识别号。
/etc/passwd 文件是一个纯文本文件,每行采用了相同的格式:name:password:uid:gid:comment:home:shell
它们的含义如下:
域 | 说明 |
name | 用户登录名 |
password | 用户口令。此域中的口令是加密的。当用户登录系统时,系统对输入的口令采取相同的算法,与此域中的内容进行比较。如果此域为空,表明该用户登录时不需要口令。 |
uid | 指定用户的 UID。用户登录进系统后,系统通过该值,而不是用户名来识别用户。 |
gid | GID。如果系统要对相同的一群人赋予相同的权利,则使用该值。 |
comment | 用来保存用户的真实姓名和个人细节。 |
home | 指定用户的主目录的绝对路径。 |
shell | 如果用户登录成功,则要执行的命令的绝对路径放在这一区域中。它可以是任何命令。 |
熟悉linux的系统的人都知道uid,android使用linux kernel,也有uid,但是anroid uid的概念和常见的linux系统的uid 概念不太一样。
linux文件系统中,每个文件都会保存属性信息,包括文件所有者uid,文件所在组gid,文件的可读可写可执行权限。这些信息称之为stat信息。
stat信息里只保存了uid,被没用用户名。熟悉ubuntu的朋友都知道,uid和用户名之间的对应关系保存在/etc/passwd目录下,有了uid,再去/etc/passwd文件里找,就能找到uid对应的用户名了。
好,我们进入adb 进入android手机,去找找/etc/passwd文件。Waht the f**k! 坑爹啊, 根本没有这个文件。
这个问题困扰了我很久,于是有一天,我决定看android源码来解决这个问题。
我从android原生shell命令ps入手。android的shell为toolbox,那么ps命令源码自然在toolbox项目下。源码路径为system/core/toolbox/ps.c。
ps命令主要是遍历/proc目录,找到所有数字开头的目录,数字开头的目录是对应pid的信息目录,目录的uid就是对应pid进程的创建者。ps中主要通过这些代码拿到用户名。
- pw = getpwuid(stats.st_uid);
- if(pw == 0) {
- sprintf(user,"%d",(int)stats.st_uid);
- } else {
- strcpy(user,pw->pw_name);
- }
- struct passwd {
- char *pw_name; /* username */
- char *pw_passwd; /* user password */
- uid_t pw_uid; /* user ID */
- gid_t pw_gid; /* group ID */
- char *pw_gecos; /* user information */
- char *pw_dir; /* home directory */
- char *pw_shell; /* shell program */
- };
man 下getpwuid,了解到getpwuid返回uid对应的password database记录的部分信息,password database通常为/etc/passwd文件。
貌似我们又回到了原点,oh god help me。我打算getpwuid看看实现代码,看看它是如何从/etc/passwd文件中找对应的record。
我在google里输入关键字“android getpwuid” (一定要用google哦,百度是搜不到的哦),找到了getpwuid的实现源码,看到了bionic字样,这才恍然大悟。原来android没有用标准的c库,用了bionic库,标准的c库中getpwuid实现一般会到/etc/passwd文件中找uid对应的record,但是bioinc中所用的uid和用户名对应的关系都是在代码里写死的,代码文件为system/core/include/private/android_filesystem_config.h。
看完代码后,有一种释然的感觉,困扰我许久的问题总算是有了答案。今后在分析android的时候,不要用传统的linux的角度去分析,尽量看android源码。
更多推荐
所有评论(0)