本系列文章为尚硅谷武晟然老师的Linux入门教程学习笔记,前面的系列文章链接如下
Linux入门教程:P3->Linux文件系统
Linux入门教程:P4->Vim编辑器
Linux入门教程:P5->网络配置
Linux入门教程:P6->系统管理
Linux入门教程:P7->Shell介绍
Linux入门教程:P8->文件目录类
Linux入门教程:P9->时间日期类
一、用户管理
背景
Linux系统是一个多用户多任务的分时操作系统,所以可能会有很多人都用同一台机器进行操作,甚至有可能还是同时登陆同时操作的。所以人一多,我们就要进行很好的管理才行,必须对于不同的用户给予他们一个相应的身份呢。也就是说给用户一个特别的帐号,这个帐号可以设置自己的密码,然后就会有着不同的权限。用户想要登录系统的时候,就分配的账号去登录系统,然后就可以获取到不同的系统资源。这就是用户管理的基本的思想。(注:必须以root的身份去进行用户管理操作)
useradd 添加新用户
基本语法:
useradd 用户名
(功能描述:添加新用户)
示例: root用户的主目录是/root
,普通用户的主目录是/home/用户
。现在通过useradd tony
创建一个普通用户tony,看看是否会存在/home/
目录下。
可以看出创建的普通用户出现在/home/目录下。
示例: 对于普通用户的主目录是可以改变的。我们通过useradd -d /home/dave david
创建一个普通用户david,同时让其主目录为/home/dave
。
可以看出,当我们查看home目录时,出现的是david的主文件夹名称dave,但是用户的名称是david。
passwd 密码设置
基本语法:
passwd 用户名
(功能描述:设置用户密码)
示例: 通过passwd tony
给tony设置密码。
设置之后就可以用tony的账号登录了。
id 查看用户是否存在
基本语法:
id 用户名
示例: 通过id查看一些用户是否存在。
可以发现存在的用户会打印出uid(用户ID)和gid(组ID),而dave是david的主目录而不是用户名称,所以不存在。
cat /etc/passwd 查看创建了哪些用户
示例: 通过查看passwd文档来查看创建了哪些用户。
从中可以看出:
①最上面有一堆其他的用户,这些用户好像我们都从来没见过,没什么用。实际上这里的大多数用户都是系统默认创建出来的,比方说bin
、daemon
、shutdown
等。这都是跟系统服务相关的,这些用户就是单独创建出来运行相应的系统服务。所以这些用户一般被称为系统用户,或者叫伪用户,就是它并不能作为真正用户的身份去登录,它就是用来去运行系统里边的服务。
②刚才创建出来的那些用户在文档最后面。分别列出了uid、gid、主目录、登录交互方式。
每个用户登录系统时需要跟系统进行交互,/bin/bash
代表跟shell交互。前面很多系统用户跟系统交互的方式都是nologin,即不用去登录,本身默认就是运行系统服务的。
su 切换用户
基本语法
su 用户名称
(功能描述:切换用户,只能获得用户的执行权限,不能获得环境变量)
su - 用户名称
(功能描述:切换到用户并获得该用户的环境变量及执行权限)
案例: 通过su xzz
切换用户xzz,可以看到当前的主目录也变成了/home/xzz
。
当前用户是xzz,我们继续使用su tony
切换到tony用户,可以看出要输入密码。执行ls
,可以发现普通用户无法查看另一个普通用户的主目录下的内容。
切换回root用户
①通过su root
②当前的用户切换跳转是一个层层嵌套的会话,即root
嵌套xzz
嵌套tony
。我们可以通过exit层层返回。
查看当前登录的用户
who am i
查看当前登录的用户的进程相关信息。
whoami
查看当前登录的用户。
案例: 通过root用户登录,查看登录的用户信息。然后切换用户,再查看登录的用户信息。可以看到who am i
始终显示真正的登陆的用户,因为切换用户还是基于当前的root用户创建的会话,这个进程还是root创建的。
sudo 设置普通用户具有root权
现在我们登录的是普通用户tony,无法访问root用户的主目录。
如果我们想临时赋予tony一些超级管理员的权限,可以使用sudo加上命令。
但是这里还是没有成功,我们需要在root用户下去修改/etc/sudoers
这个配置文件。可以看到下面这一行代表了root可以在任何地方执行任何指令。
于是我们赋予tony同样的权限。
然后进行测试,此时就可以使用sudo ls
查看root主目录下的内容了。
userdel 删除用户
基本语法:
userdel 用户名
(功能描述:删除用户但保存用户主目录)
userdel -r 用户名
(功能描述:用户和用户主目录,都删除)
注:该操作要在root用户下操作。
示例: 使用userdel tony
删除tony用户,但是保留主目录。一般这种情况用的多,因为虽然用户不在了,但是可能他之前的文件还有用。
使用cat /etc/passwd
可以看到没有tony用户了
我们userdel -r david
删除david,可以看到主目录没了。
同时,passwd文件也没有david用户了。
二、用户组管理
用户组管理
用户组就相当于一个小组,比如一个公司里面有研发组、测试组、运维组等等。每个组内的用户负责不同的事情,这就相当于拥有了系统里面不同的权限。Linux里面默认创建新用户时,会创建一个跟用户名相同的组名、跟用户ID相同的组ID。
现在,我们想新建一个meifa
组,使用命令groupadd meifa
。然后使用命令cat /etc/group
去查看group配置文件,可以看见成功创建了meifa组。
如果想修改组名,可以通过group -n 新组名 老组名
来完成修改,我们这里将meifa修改为harcut。
现在我们想将tony和david加入haircut组,可以使用usermod -n 用户组 用户名
。
此时查看tony和david的gid,可以发现已经变为1005了。
最后,由于将tony和david移动到了haircut组,所以我们将原来的david和tony组删除。可以通过groupdel 组名
来删除。
查看group配置文件,可以发现已经删除了。
wheel用户组
sudoers
配置文件中有一个wheel用户组,它比较特殊,是管理组。在这个组里面的用户拥有权限去执行所有的命令。
我们可以先将atguigu用户移动到wheel组,然后切换到atguigu用户,执行sudo ls
。可以发现虽然sudoers
配置文件里面没有设置atguigu用户,但是仍然可以直接使用命令,这就是由于atguigu在wheel工作组里面的原因。
可以看到这里还是需要输入密码,可以使用下面那一行,即在sudoers配置文件的wheel后面加上NOPASSWD:ALL
。这样使用sudo就不用输入密码了。
三、文件属性和权限
背景
问题: 前面我们介绍了用户管理和用户组管理的相关命令,我们就会思考一个问题:用户组划分出来之后是为了干什么?
答: 就是为了把很多用户做集中化管理。
问题: 这些用户集中在一起构成了一个用户组,怎样去针对他和其他的组进行区别?
答: 他们的区别在于拥有不同的系统操作权限。
问题: 用户除了可以访问各自的主目录里面的内容,其他的目录里的内容谁才可以访问呢?
答: 除了用户自己的主目录访问外,别的文件和文件夹针对不同的用户、用户组也有一个权限的划分。这就是文件权限的管理。
文件属性
Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定,具体如下图所示。
文件权限涉及到硬件是因为Linux系统里边一切皆文件,所有的设备也是用文件来进行管理的,当然就得有对应的文件类型。对应这些设备文件可以在/dev/
设备目录下边看到所有的内容。在Linux中我们可以使用ll
或者ls -l
命令来显示一个文件的属性以及文件所属的用户和组。
文件权限标识字符:
①0首位表示类型
-
:代表文件
d
:代表目录
l
:代表链接文档(link file)
c
:字符类型的设备文件。比如鼠标键盘,它们输入的操作可能涉及到字符。
b
:块设备文件。比如硬盘。
②第1-3位确定属主(该文件的所有者)拥有该文件的权限 —User
③第4-6位确定属组(所有者的同组用户)拥有该文件的权限 —Group
④第7-9位确定其他用户拥有该文件的权限 —Other
rwx 作用文件和目录的不同解释:
①作用到文件:
[r]
代表可读(read): 可以读取,查看
[w]
代表可写(write): 可以修改,但是不代表可以删除该文件,删除一个文件的前
提条件是对该文件所在的目录有写权限,才能删除该文件。
[x]
代表可执行(execute):可以被系统执行
②作用到目录:
[r]
代表可读(read): 可以读取,ls查看目录内容
[w]
代表可写(write): 可以修改,目录内创建+删除+重命名目录
[x]
代表可执行(execute): 可以进入该目录,即cd命令
示例: 下面这些目录文件夹对于属主root有读、写、可执行权限,属组和其他用户拥有读和执行。
我们可以测试一下。
①退到根目录/
,然后ll
看当前目录的权限。可以看到root是有权限访问这个root
目录的,root组的用户也可以访问,但是其他用户不能。
②使用ls -al
,其中-a
代表可以看到隐藏文件和目录(以一个点开头的)。因此,我们这里可以看到.
和..
对应的权限,对于当前目录.
其他用户是无法访问的。
示例: 将这里的anaconda和initialsetup这两个cfg文件拷贝到普通用户xzz的用户目录下。
可以看到这两个文件的所属还是没变,权限也没变。因此使用cat访问anaconda这个配置文件就会出错。
而initialsetup配置文件是可以访问的,但是不能写入,除非使用sudo
和wq!
。
文件基本属性解释
其中,如果查看到是文件:链接数指的是硬链接个数。如果查看的是文件夹:链接数指的是子文件夹个数。
示例: 这里的公共
目录里面有2个子文件夹。
但是进去ls后发现是空的。
使用ls -a
可以看到里面有.
和..
,这本质上也是两个文件夹
四、更改文件权限
chmod 改变权限
背景: 如果当前想要去访问或修改一个文件里面的内容,但是又没有权限,这时最简单的想法当然就是切成root用户,或者说加上sudo,但是这个权限显然是非常大的。一般情况我只想访问某一个文件的时候,只要把对应这个文件的权限进行更改即可,这就相当于给我们提供了更加丰富、更加精细的对于权限的管理。
基本语法
第一种方式变更权限:chmod [{ugoa}{+-=}{rwx}] 文件或目录
其中:ugoa
分别代表属主、属组、其它、全部。+-=
分别代表增加、减少、指定权限。rwx
代表读、写、执行。
示例: 使用chmod u+x initial-setup-ks.cfg
命令为initial这个配置文件添加属主的执行权限。
通过chmod a=rw initial-setup-ks.cfg
为所有用户指定对initial配置文件的读写权限。
第二种方式变更权限:chmod [mode=421] [文件或目录]
其中,r=4 w=2 x=1, rwx=4+2+1=7
,其实就对应了rwx三位二进制的值。
rwx
1-x。001
2-w。010
3-wx。011
4-r。100
5-rx。101
6-rw。110
7-rwx。111
示例: 使用chmod 777 initial-setup-ks.cfg
为initial配置文件指定所有权限。
修改目录的权限
问题引出: 修改目录的权限涉及到另外一个问题:我们对于目录进行操作,当前目录拥有可读可写可执行权限了。假如它下面还有其他的子目录和子文件的话,那里边还是不可读不可写,那怎么办呢?
答案: 这时我们希望嵌套地递归,内部的所有子文件、子文件夹都拥有相关的权限。具体做法为:加上-R
,如chmod -R 777 xiyou/
。这是比较强大的一招,接下来这个目录就相当于谁都可以用,但是也要小心,这相当于开放了完整的权限,谁都可以去改,谁都可以去删。
chown 改变所有者
基本语法:
chown [选项] [最终用户] [文件或目录]
(功能描述:改变文件或者目录的所有
者)
选项:-R
:递归操作,用于更改目录的所有者。
chgrp 改变所属组
基本语法:
chgrp [最终用户组] [文件或目录]
(功能描述:改变文件或者目录的所属组)
示例: 修改initial配置文件的属主和属组用户。
五、综合应用案例
案例描述: 在公司里有不同的部门不同的组,比如大数据是一个部门,测试是一个部门。同一个组里面的人可以读取、修改属于该组的文件和目录,但是其他组成员就只能访问。
1、创建组和用户
使用
groupadd bigdata
和groupadd test
创建大数据组和测试组。
查看/etc/group
配置文件,可以看到成功创建。
使用useradd -g 组名 用户名
为大数据组和测试组添加成员,并使用id 用户名
查看相关信息。
还可以看到home目录下各个用户也有对应的主目录文件夹。
2、创建文件
切换到用户小明,在其主目录下创建代码文件import_code
该文件的权限如下。
此时如果切换到同组的小亮,可以看到小亮无法访问小明的主目录。
切换到home目录去,可以看到小明的主目录只对小明有所有权限
因此,需要让小明的主目录为属组成员开启可执行权限(代表可进入目录)和可访问权限。
此时小亮就可以进入小明的主目录并访问import_code文件了。
但是不能去修改该文件
即使加上wq!
也无法保存,因为加感叹号相当于执行sudo,而小亮是没有sudo权限的。
如果想让该文件对组内成员可修改,则切换到小明,然后修改import_code的权限。
3、组外成员访问
假设测试组的小红想要访问该文件,可以看到连小明的主目录都进不去,于是需要为小明的主目录指定权限。
然后小红就能进去并访问import_code目录了,但是仍然不能修改。
如果此时测试组的小蓝转部门到大数据组,则可以看到成功转过来了。
小蓝此时对import_code文件也有修改权限了。