6.Linux用户与组
前言
经过前面几节课的学习,我们应该是慢慢的可以脱离Linux
的图形窗口了,这节课带大家认识下Linux
中的用户与权限,这节课学完后面我们大部分情况下甚至都不用在虚拟机上去操作我们的Linux
了
用户与组与权限
用户
首先我要了解到Linux 是多用户多任务的分时操作系统,看到这句话是不是懵了,什么是多用户?什么是多任务?什么是分时?
其时上面那句话这样说大家就明白了,Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响
不同用户具有不同的权限,毎个用户在权限允许的范围内完成不同的任务,Linux 正是通过这种权限的划分与管理,实现了多用户多任务的运行机制
所以说任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护
每个用户都有唯一的用户名和密码。在登录系统时,只有正确输入用户名和密码,才能进入系统和自己的主目录
权限
在Linux中,最常见的文件权限有 3 种:可读(r)、可写(w)、可执行(x),在 Linux 系统中,每个文件都明确规定了不同身份用户的访问权限,通过 ls -l
命令即可看到,我们在用户家目录执行ls -al
可以看到如下输出
-
权限是显示数据的第一列,第一列由10个字符组成
-
第1位:文件类型,-表示文件,d表示目录
-
第2-4位:文件所有者的权限
-
第5-7位:文件所有者所属组成员的权限
-
第8-10位:所有者所属组之外的用户的权限
-
-
第三列为文件所属用户
-
第四列为文件所属用户组
用户组
用户组是具有相同特征用户的逻辑集合。简单的理解,有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件的权限,一种方法是分别对多个用户进行文件访问授权,如果有 10 个用户的话,就需要授权 10 次,那如果有 100、1000 个用户呢?
显然,这种方法不太合理。最好的方式是建立一个组,让这个组具有查看、修改此文件的权限,然后将所有需要访问此文件的用户放入这个组中。那么,所有用户就具有了和组一样的权限,这就是用户组
Linux的用户管理
用户管理工作主要就是对用户的增加修改和删除操作
用户配置文件
Linux
系统中的 /etc/passwd
文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。
我们使用cat
来打开一下这个文件看看其中的内容
cat /etc/passwd
可以看到,/etc/passwd 文件中的内容非常规律,但这个文件具体的意义是什么呢?
文件中每行为一个用户信息,对于每行我们以:
为分隔符从左到右依次如下:
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
为了方便大家的查看,大家可以使用如下命令在桌面上创建print.awk
文件
cat <<EOF>print.awk
BEGIN {
printf("-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n")
printf("| %-20s | %-4s | %-6s | %-6s | %-65s | %-30s | %-20s |\n","username","pass","UID","GID","description","home","shell")
printf("-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n")
printf("-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n")
}
{
printf("| %-20s | %-4s | %-6s | %-6s | %-65s | %-30s | %-20s |\n",\$1,\$2,\$3,\$4,\$5,\$6,\$7)
printf("-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n")
}
EOF
然后我们再使用之前学过的awk
命令对其输出
awk -F ':' -f print.awk /etc/passwd
我们来解释一下每一列的具体意义
名称 | 含义 |
---|---|
用户名 | 就是一串代表用户身份的字符串 |
密码 | "x" 表示此用户设有密码,但不是真正的密码,真正的密码保存在 /etc/shadow 文件中,但/etc/shadow 这个文件中的密码是加密的 |
UID | 每个用户都有一个 UID,Linux 系统通过 UID 来识别不同的用户,0为超级管理员 |
GID | 用户初始组的组 ID 号 |
描述性信息 | 用来解释这个用户的意义 |
主目录 | 用户登录后有操作权限的访问目录,通常也被称为用户的家目录 |
默认shell | Linux 的命令解释器,其中/sbin/nologin 表示不能登录shell |
su命令
su
命令用于在linux
中切换用户身份,其用法如下
su [username] # 这里的username可以省略,省略则默认为root
添加用户
我们可以使用命令useradd
来添加用户,useradd
命令的使用如下
useradd [options] username
参数 | 含义 |
---|---|
-d | 指定用户主目录,如果此目录不存在,则同时使用-m 自动创建主目录(父目录必须存在) |
-g | 指定用户所属的用户组 |
-G | 指定用户所属的附加组 |
-s | 指定用户的登录Shell |
-c | 指定一段注释性描述 |
-u | uid,指定uid,如果同时有-o 选项,则可以重复使用其他用户的标识号 |
一般情况下我们什么参数都不加则会创建一个用户,用户名为username
,用户的主目录为/home/username
,用户所属组为username
,无附加组,用户登录的shell为/bin/bash
其实添加用户就是在/etc/passwd
文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow
, /etc/group
等
练习:
- 创建一个名为
tom
的用户,用户组为tom
,家目录为/home/tom
(提示:组信息保存在/etc/group
)
useradd tom
- 创建一个名为
worker
的用户,用户组为worker
,家目录为/data/worker
,描述信息为工作用户
且不能登陆shell
mkdir /data && useradd worker -d /data/worker -c 工作用户 -s /sbin/nologin -m
删除用户
我们可以使用userdel
命令来删除某一用户,userdel
命令使用如下
userdel [-r] username # -r作用是把用户的主目录一起删除
userdel
删除用户在系统文件中(主要是/etc/passwd
, /etc/shadow
, /etc/group
等)的记录,,如果添加了-r
选项则会同时删除用户的主目录
练习:
- 删除
tom
用户及其主目录
userdel -r tom
- 删除
worker
用户不删除其主目录
userdel worker
修改用户
我们可以使用usermod
命令来修改已存在用户的相关信息如主目录、用户组等
usermod [options] username # 这里的options同useradd中的options,就不做过多解释
练习:
修改worker
用户的家目录为/home/worker
且让其可登录
usermod -d /home/worker -s /bin/bash -m worker
修改密码
用户管理的一项重要内容是密码管理,用户刚创建时没有密码的
指定和修改用户密码的命令是passwd
。超级用户可以为自己和其他用户指定密码,普通用户只能用它修改自己的密码
passwd [options] [username] # username不填默认为当前用户
选项 | 含义 |
---|---|
-l | 锁定密码,即禁用账号 |
-u | 解锁 |
-d | 使账号无密码 |
-f | 强迫用户下次登录时修改口令 |
--stdin | 仅超级用户可用,对密码不做任何校验 |
一般情况下,普通用户使用passwd
时的过程如下:
passwd
Old password:******
New password:*******
Re-enter new password:*******
passwd
命令会先询问原密码,验证后再要求用户输入两遍新密码,如果两次输入的密码一致,则将这个密码指定给用户;而超级用户为用户指定密码时,就不需要知道原密码
为了安全起见,密码的校验规则为8及以上位长,包含有大写、小写字母和数字,并且应该与姓名、生日等不相同
如果想取消这个限制可以参考CentOS7取消密码难度校验
远程登录
Linux 一般作为服务器使用,而服务器一般放在机房,你不可能在机房操作你的 Linux 服务器,这时我们就需要远程登录到Linux服务器来管理维护系统
Linux 系统中是通过 ssh 服务实现的远程登录功能,默认 ssh 服务端口号为 22
前提
我们首先需要知道Linux主机的ip,其次我们要确保可以从我们自己的机器能通过网络连接到Linux主机
使用ip addr show
或ifconfig
可以查看Linux系统的ip地址
在自己的机器可以使用ping ip
来验证
客户端
- 我们可以使用ssh客户端,如
MacOS
,大部分主流Linux
及Windows 10
以上的操作系统都默认有装ssh
客户端,我们只需要通过在终端输入ssh-p [port] username@ip
就可以远程登录了,如果Linux主机的ssh端口为22则可省略 - 通过第三方程序,由它们帮我们完成
ssh
登录
Linux组管理
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理,用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group
文件的更新
添加用户组
增加一个新的用户组使用groupadd命令
groupadd [-options] roupname
选项 | 含义 |
---|---|
-g | 指定GID |
-o | 表示可以与其它用户组使用相同的GID |
删除用户组
如果要删除一个已有的用户组,使用groupdel命令,其格式如下
groupdel groupname
修改用户组
修改用户组的属性使用groupmod命令。其语法如下
groupmod [-options] groupname
选项 | 含义 |
---|---|
-g | 新GID |
-o | 表示可以与其它用户组使用相同的GID |
-n | 新名称 |
切换用户组
如果一个用户同时属于多个用户组,那么用户可以使用命令newgrp在用户组之间切换,以便具有其他用户组的权限,
newgrp groupname
权限相关命令
chmod
chmod
(全称:change mode)命令是控制用户对文件的权限的命令
Linux
的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
chmod [options] mode filename...
选项 | 含义 |
---|---|
-v | 显示权限变更的详细资料 |
-f | 若该文件权限无法被更改也不要显示错误讯息 |
-R | 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更) |
这里的mode可以使用权限字符串,也可以使用8进制表示
权限字符串
[who][operator][permission]
- who:给谁加权限,u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是
- operator:设置权限,+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限
- permission:权限列表,r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行
8进制模式
数字 | 权限 | rwx | 二进制 |
---|---|---|---|
7 | 读 + 写 + 执行 | rwx | 111 |
6 | 读 + 写 | rw- | 110 |
5 | 读 + 执行 | r-x | 101 |
4 | 只读 | r-- | 100 |
3 | 写 + 执行 | -wx | 011 |
2 | 只写 | -w- | 010 |
1 | 只执行 | --x | 001 |
0 | 无 | --- | 000 |
这样mod可以用3个数字直接表示,例如:765 将这样解释
- 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7
- 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6
- 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5
练习:
在桌面创建start.sh
文件,给用户读写执行权限,给用户所属组读,给其它成员无权限
touch start.sh
chmod 740 start.sh
chown
chown
(全称:change owner)命令用于设置文件所有者和文件关联组的命令,需要超级用户才能执行
Linux
是多人多工操作系统,所有的文件皆有拥有者,利用 chown 将指定文件的拥有者改为指定的用户或组
chown [options] user[:group] filename..
选项 | 含义 |
---|---|
-f | 忽略错误信息 |
-v | 显示详细的处理信息 |
-R | 处理指定目录以及其子目录下的所有文件 |
练习:
- 创建
/data/work
目录,在其下创建1.txt
,2.txt
文件,更改/data/work
目录及其下的文件所属的用户为worker
,用户组为work
chown -R worker:work /data/work/
sudo
在命令前面加sudo
可以以非超级用户身份执行超级用户有权执行的命令,但前提是需要授权
关于给普通用户授权可以编辑/etc/sudoers
文件,在最后一页可以看到如下内容:
可以看到这行
%wheel ALL=(ALL) ALl
我们复制,然后将%wheel
改为目标用户就可以了,后面的ALL给的权限,我们这里就简单些给所有权限
这个时候用普通用户创建/testdir
目录会报无权限,我们可以加上sudo
再测一下
综合练习
- 创建用户组
developer
,创建用户zhangsan
,lisi
,wangwu
并指定他们的家目录为/developer/{name}
,所属组为developer
# 切换root用户,当然大家也可以用有root权限的用户在下面的命令前加sudo
su
# 创建/developer目录
mkdir /developer
# 创建用户组
groupadd developer
# 添加用户
useradd -d /developer/zhangsan -g developer -m zhangsan
useradd -d /developer/lisi -g developer -m lisi
useradd -d /developer/wangwu -g developer -m wangwu
- 修改
zhangsan
,lisi
,wangwu
的密码为1234(可以把一组命令放到文件中,然后给文件加上执行权限就可以通过执行这个文件的方式执行其中的命令)
cd /developer && ls | awk '{printf "echo 1234 | passwd %s --stdin\n",$1}' > pass.sh && chmod +x pass.sh && /bin/sh pass.sh && rm -fr pass.sh
- 创建
/developer/common
的目录并修改所属为zhangsan
,所属组为developer
,并给其所属用户及所属组加上读写执行权限,其它用户无权限
cd /developer
mkdir common
chown -R zhangsan:developer common
chmod -R 770 common/
- 切换用户身份为
zhangsan
在/developer/common
目录下创建hello.txt
并写入hello,i am zhangsan
,并为组加上读写权限
su zhangsan
cd /developer/common
echo 'hello,i am zhangsan' > hello.txt
chmod 664 hello.txt
- 切换用户身份为
lisi
和wangwu
分别在/developer/common/hello.txt
追加hello,i am {name}
su lisi/wangwu
cd /developer/common
echo 'hello,i am lisi/wangwu' >> hello.txt
- 创建用户
zhaoliu
,用户组为zhaoliu
,家目录为/home/zhaoliu
,所属组为zhaoliu
useradd zhaoliu
- 尝试执行上在
/developer/common/hello.txt
追回hello,i am zhaoliu
- 修改
zhaoliu
的附加组为developer
usermod -G developer zhaoliu
- 再次测试
小结
这节课给大家简单的讲了下Linux
中的用户及权限,也教大家远程登录,后续的课程中我们就很少会直接在Linux
主机上操作了,都会使用远程登录的方式