口令文件:/etc/passwd,getpwuid,getpwnam 函数,修改my_ls(系统信息)【linux】(z) - Go语言中文社区

口令文件:/etc/passwd,getpwuid,getpwnam 函数,修改my_ls(系统信息)【linux】(z)


口令文件

什么是口令文件?
存放用户账户信息的文件,就是口令文件。
ls 查看下 /etc/passwd
在这里插入图片描述对于这个文件,只有文件所属用户root才有写权限,组员用户以及其它用户,只有读权限。所以当普通用户打开这个文件时,是以其它用户的身份来打开文件的,所以对应的权限只允许r,不允许写。当然这个文件是没有x权限的,因为文本文件放的是文字编码,不是机器指令,不需要被cpu执行。对于普通用户而言,不需要向这个文件写入任何数据,顶多就是读取里面的数据。不过当我们调用某些命令的时候,这些个命令会去修改该文件。比如调用useradd添加新的用户,系统执行这个命令时,系统会把新用户的账户信息,写到这个文件中保存。

我们打开文件进行查看:
vi /etc/passwd :
在这里插入图片描述

每一行对应一个用户的账户信息。

第一个是root管理员账户的用户信息。
那么中间是linux 系统自己创建的用户信息,最后是我自己创建的用户信息:
在这里插入图片描述

账户所包含的信息:
以我创建的
stu: x:1000:1000::/home/stu:/bin/bash
为例子
分为7个字段,字段间使用:分隔
用户名:密码:用户ID:用户所在组的组ID:注释:用户主目录的路径:shell程序的路径。

用户名
比如root、zxf、newUser

密码
为了安全起见,真实的密码并不放在这里,而是放在了/etc/shadow中,这里只是使用一个X来代表。X表示有密码,如果没有X(字段是空的),表示这个用户没有密码。

用户ID
root的用户ID为0,在Linux下,root管理员用户的ID都是0
stu的用户ID为1000
newUser用户ID为1001
用户ID都是由系统自动分配的。

组ID
默认情况下,每个用户都有一个自己的组,组里面就自己一个组员,组长就是自己,自己的用户ID就是组ID。新建用户后,每个用户所在组就是自己这个组,所以你才会发现对于绝大多数用户来说,它的组ID也是自己的ID。其实,执行相应的命令,可以将我的用户加入其它用户的组,也可以其它用户也可以加入我的组,成为我的组员。由于有关组这个东西,在我们实际开发的过程中,我们基本用不到,因此我们这里就不说明如何通过命令来修改用户的所在组。

注释
账户注册者的个人信息,如果信息很多的话,信息之间使用,分隔。
注册者的信息有哪些呢?
比如注册者的名字、电话、办公地址、邮箱等等。一般的人嫌麻烦,在注册账户的时,都不会填写这些内容,所以注释字段基本都是空的。

用户主目录的路径
系统启动起来后,用户登录系统时,会用到主目录,所以这里有记录主目录的路径,用户登陆后,系统便会从这里得到该用户的主目录路径。然后登录主目录。千万不要去修改主目录的路径,修改之后很可能会导致你下一次无法登录,如果你好奇心重,就想改改看,那你一定要先做好的备份。不仅主目录路径不能改,其它信息你也不能改。我创建stu目录路径就是/home/stu

shell程序的路径
shell程序,是一个命令的解释程序,说白了就是解析我们从终端输入的各种命令的。在/bin下还有一个shell程序叫dash(/bin/dash),但是/etc/passwd文件中给的路径是/bin/bash,那么登陆后,启动的就是bash,而不是dash。因为dash和bash都是二进制的可执行程序,因此都放在了bin目录下。我们linux 中的终端只是为了获取和输出显示命令,背后其实是shell命令解释程序来解释终端输入的命令程序。

getpwuid,getpwnam 函数

这两个函数的作用是,获取passwd文件中的账户数据,其实,我们也可以调用open、read等文件io函数来读取passwd文件的数据,但是Linux系统提供了更加便捷的API,通过这些API,可以更加方便的读取,比我们自己调用open、read来的更便捷。

getpwuid、getpwnam这个两个函数是c库函数,这两个函数也是靠封装open、read等函数来实现的。

函数原型

#include <sys/types.h>
#include <pwd.h>
struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(const char *name);

功能
getpwuid:使用用户ID(uid),到/etc/passwd中搜索,并获取对应账户信息。
getpwnam:使用用户名(name),到/etc/passwd中搜索,并获取对应账户信息。调用这两个函数时,函数会开辟一个struct passwd结构体变量,然后把从文件中读到的账户数据,保存到结构体变量。

stu: x:1000:1000::/home/stu:/bin/bash

struct passwd
 {
		char   *pw_name;       /* 用户名,字符串形式 */
		char   *pw_passwd;     /* 是否有密码 */
		uid_t   pw_uid;        /* user ID ,用户ID*/
		gid_t   pw_gid;        /* group ID ,组ID*/
		char   *pw_gecos;      /* 注释 */
		char   *pw_dir;        /* 主目录路径 */
		char   *pw_shell;      /* shell程序路径 */
 };

返回值
(a)成功:返回struct passwd结构体变量的指针。
(b)失败:返回NULL,errno被设置。

修改my_ls

把显示的ID形式换成用户名。
方法:使用getpwuid(uid)函数,该函数通过uid获取得到用户的账户信息,然后就能得到用户名。

stu: x:1000:1000::/home/stu:/bin/bash

关于my_ls 的完成实现会有一篇专门的博客进行详细说明,这里不再进行说明。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_43648751/article/details/104349789
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢