Linux命令总结之用户权限管理

HyriKuma

总结一下Linux系统下用户和权限的概念,以及相关命令的使用。

1. 用户和权限的概念

Linux是一个多用户的系统,这点与Windows不同,它允许多个使用者以不同类型和不同权限的用户身份同时登录主机,共同分配主机的资源,由此便引出了用户和用户组以及相关权限的概念。

1.1 用户和用户组

由于Linux是多用户系统,不同用户对应不同文件的权限管理是必然要考虑的问题。就比如在同一个系统中,A用户的文件只能由A用户修改查看,而其他人想要修改A用户的个人文件则会被禁止,这也就保证了每个用户都能有单独的权限空间,也就避免了文件管理越界所导致的权限混乱。由此从文件权限角度出发,就引出了三个权限对象:用户用户组其他人

  • 用户

用户也就是文件的创建者和所有者,对文件拥有最高权限,只有用户才可以将文件的权限进行开放出来,允许其他人对文件进行查看、修改、执行操作。而如果用户想要将文件仅对部分人权限开放,此时仅仅区分用户和其他人显然不能满足需求,这也就出现了用户组这一概念。

  • 用户组

如果用户想要将文件权限仅仅对部分人开放而对其他人关闭,这时候只要将这部分人划入用户即文件所有者所在的同一用户组,用户在组内开放权限即可。同样用户能对组内成员进行权限管理,允许组内成员对文件进行查看、执行、修改不同权限的操作,这样既能保证组内的资源共享,又能对外保证用户组的资源私有。

需要知道用户组分为主组和附加组,当一个用户被创建出来时,系统会默认创建出来一个和用户名相同(可以修改)的主组,也称为初始组。每个用户有且只能归属于一个主组。除了主组以外,用户还能加入多个附加组,享受多个用户组的权限,需要注意用户在附加组内能够被直接移除,附加组并不会受到影响。

  • 其他人

其他人也就是除了用户和用户组成员以外的外部成员,通常得到的权限最低。

1.2 root用户

root用户在Linux系统中属于是拥有最高权限的超级用户,拥有对系统内几乎所有资源的权限,可以执行几乎任何操作。默认情况下只有admin组和sudo组成员才能执行sudo命令来得到root权限进行操作,而sudoers的信息存放在/etc/sudoers 文件中。打开文件可以看到

1
2
3
4
5
6
7
8
# User privilege specification
root ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL

这说明root用户拥有所有的权限,而admin组和sudo组的成员可以执行sudo命令来获取root权限。

其中的ALL=(ALL:ALL) ALL分别对应

1
主机名=(用户身份:用户身份所在用户组) 可执行命令

要想让某个用户获得sudo权限,可以让用户加入admin组或sudo组,也可以在root下手动添加用户的sudo信息,比如

1
2
3
# User privilege specification
root ALL=(ALL:ALL) ALL
sudouser ALL=(ALL) ALL

此时新添加进sudo规则中的sudouser用户就拥有了sudo执行权限。

1.3 用户和用户组的相关配置文件

用户信息文件:/etc/passwd

用户组信息文件:/etc/group

用户密码信息:/etc/shadow

用户组密码信息:/etc/gshadow

需要知道用户和用户组的管理都需要在root权限下进行。

2. 用户组管理

Linux将用户组相关的信息存放在/etc/group中,每一行的储存格式为

1
2
3
4
5
examplegroup:x:1100:user1,user2 #附加组
#用户组名称:用户组密码占位符:用户组GID:用户组所包含的用户

newuser:x:1001: #newuser归属的主组
#用户组名称:用户组密码占位符:用户组GID

要想添加用户组,需要使用groupadd命令,写法为

1
groupadd [选项] [用户组名称]

比如

1
2
groupadd -g 2000 newgroup #创建一个名为newgroup的用户组,并指定组ID即GID为2000
groupadd -r newgroup #创建一个系统内(GID小于1000)的用户组

而要想修改用户组的名称或者GID等属性,需要用到groupmod命令,写法同样为

1
groupmod [选项] [用户组名称]

比如要修改newgroup组的GID和名称,可以这样写

1
groupadd -n mygroup -g 1500 newgroup #将用户组名称修改为mygroup,GID修改为1500

如果要删除用户组,则需要使用groupdel命令,比如

1
groupdel mygroup #删除mygroup用户组

要想查看某个用户所属的用户组,应该使用groups命令,例如

1
groups linuxuser

能得到返回结果

1
linuxuser : linuxuser admin sudo mygroup ... #冒号后面即为用户所属的所有用户组

3. 用户管理

Linux将用户信息相关信息存放在/etc/passwd文件中,每一行的存储格式为

1
2
serveruser:x:1000:1000:Ubuntu:/home/serveruser:/bin/bash
#用户名:用户密码占位符:用户uid:用户主组GID:用户家目录:用户所使用的解释器

如果要给系统添加用户,需要使用useradd命令,写法为

1
useradd [选项] [用户名]

一些常用的选项有

1
2
3
4
5
-g #为新增用户指定主组,默认情况下在用户被创建出来时会被自动归属到和用户同名的用户组中
-G #为新增用户指定加入的附加组
-u #为新增用户指定uid即用户id,默认从1000开始往下排序
-m #为新增用户创建一个在/home下的家目录
-s #指定新增用户的shell解释器

比如

1
2
3
4
5
6
7
8
9
#创建一个名为devuser的用户,为其添加家目录,并将其归属到devgroup组中
useradd -G devgroup -m devuser
#此时得到用户信息可以为
uid=1002(devuser) gid=1002(devuser) groups=1002(devuser),1500(devgroup)

#创建一个名为devuser的用户,为其添加家目录,并将其主组指定为devgroup
useradd -g devgroup -m devuser
#此时得到用户信息应为
uid=1003(devuser) gid=1003(devuser) groups=1003(devuser)

而要给用户设置密码,一般是单独使用passwd命令

1
passwd user

然后根据提示输入两次新用户的密码进行确认。

要想修改用户属性,应该使用usermod命令,写法为

1
usermod [选项] [用户对象]

常见用法有

1
2
3
4
5
6
usermod -l new_username old_username #修改用户名
usermod -u new_uid username #修改用户uid
usermod -g new_primary_group username #为用户修改主组
usermod -G new_primary_group username #为用户指定附加组,注意这会覆盖先前指定的附加组
usermod -G group1,group2,group3 username #为用户指定多个组,用逗号隔开
usermod -aG additional_group username #将用户添加到一个新的附加组,-a表示追加

要将用户从某个用户组中移除,还可以使用gpasswd

1
gpasswd -d username groupname 

而要想删除用户,只需要执行userdel命令即可

1
2
userdel del_user #删除用户del_user
userdel -rf del_user #强制删除用户,并移除其家目录

其他一些用户状态查看命令

1
2
3
4
5
6
id username #查看指定用户的详细信息
whoami #显示当前登录用户
who #显示已登录用户终端信息
w #显示已登录用户的进程负载信息
last #显示近期登录的终端记录
lastlog #显示用户的登录记录

4. 权限管理

4.1 理解文件的权限

在Linux中,文件的操作权限被分为读取(read)、写入(write)、执行(execute),即对应r、w、x,而在操作者上又分为用户(user)、用户组(group)、其他人(others),即对应u、g、o。我们可以通过ls -lh命令来查看文件或目录的详细属性和权限信息,例如

1
2
3
$ ls -lh nginx
#得到返回
-rwxr-xr-x 1 root root 1.2M May 31 2023 nginx

在上述返回信息中,-rwxr-xr-x代表文件的权限,第一个-代表文件类型,此处为普通文件。接着rwx代表用户权限,表示用户对文件有读取、写入、执行的操作权限,之后r-x代表用户组权限,最后r-x代表其他人权限。

接下来是文件的所属信息,第一个root代表文件属于root用户,第二个root代表文件属于root组。

其他信息如权限信息后的1代表文件硬链接数量,1.2M即为文件的大小等。

4.2 修改文件和目录的权限

要想修改文件或目录的权限,应该使用chmod命令,来更改文件的读取、写入、执行权限,以及目录的列出、创建、删除权限,权限的修改分为符号表示法和数字表示法。

在符号表示法中,以ugoa来分别代表用户、用户组、其他人、所有用户四种不同用户类型,并使用+-=符号来增加或移除权限,比如

1
2
3
4
chmod u=rwx file.txt #令用户拥有对file.txt文件的读取、写入、执行权限
chmod g=r-x file.txt #令用户组成员对file.txt文件拥有读取和执行的权限
chmod a+r file。txt #令所有人对文件file.txt都获得对文件的读取权限
chmod o-x file.txt #令其他人对文件file.txt失去执行的权限

而在数字表示法中,数字和权限的对应关系为

权限 数字
r 4
w 2
x 1

将数字相加,即可得到相应的权限组合,比如7=4+2+1,代表具有读取、写入、执行的权限,5=4+1,代表具有读取、执行权限,因此写法为

1
2
chmod 750 file.txt #数字7、5、0分别对应用户、用户组、其他人所拥有的权限
chmod 777 file.txt #表示对所有人都开放最大权限

而要想递归修改目录的权限,则应该添加-R选项,这能够为指定目录及其所有子目录和文件修改权限配置。

1
chmod -R 755 mydir

4.3 修改文件和目录的所属

要修改文件的所属,应该使用chown命令,写法为

1
chown [选项] 修改用户:修改组 文件或目录名

比如

1
chown newuser:newgroup file.txt #这表示将文件file.txt的所属用户修改为newuser,所属组修改为newgroup

而要想给某个目录以及其所有内容修改权限,同样需要用到-R递归选项

1
chown -R newuser:newgroup mydir 

另外还可以使用chgrp命令来修改文件目录的所属组

1
chgrp newgroup file.txt #将文件的所属组修改为newgroup

同样也可以添加-R选项来进行递归修改

1
chgrp newgroup mydir 

需要注意无论是chown还是chgrp命令都需要相关权限才能执行,一般是root用户或文件的所属者才能操作。