Linux 下有两种用户: 超级用户和普通用户
root
, 是超级管理员, 用户目录是 /root/
./home/xxx
, 以在Linux下做有限的事情如何身份切换?
使用
su
指令进行身份切换
su -
以 root 重新登陆. 将当前工作目录改为 root
家目录
超级用户命令提示符是 #
; 普通用户命令提示符则是 $
按住 Ctrl-D
可以退出当前用户的登陆.
每登陆一个用户就会创建一个相对应的 bash
进程, 退出实则是杀死 bash
进程.
本质上, 自己是可以登陆自己的, 两者对应的 bash
进程进程 id 肯定不一样
su
普通用户切换成 root
不同于 su -
, su -
是直接将当前工作目录更改为 root
家目录
而 su
的当前工作目录仍然没有变化
总结
普通用户切换用户(包括 root
和 普通用户)都需要输入目标用户的密码(登陆到root
需要root
密码, 登录到普通用户需要普通用户密码).
root
切换成普通用户不用验证.
为什么要进行身份切换
普通用户想要进行只能
root
操作的命令, 只能切换为root
进行操作.
但每次切换会很麻烦
sudo + 原本要输入的指令
, 可以以普通用户身份按 root
权限执行一条命令.
sudo
对当前的指令进行短暂提权, 需要输入当前用户密码.
但是上述操作仍然没有成功, 提示当前用户没有在sudoer file
, 这是用户信息列表配置文件, 只有 root
才可以进行修改.
sudoer file 相当于白名单, 但是只能
root
进行修改
用户名在配置文件中, 允许用户使用sudo
用户名不在配置文件中, 不允许用户使用sudo
这也就是为什么 sudo
指令只需要输入当前用户密码, 普通用户只有经过 root
管理员现实中同意后, 管理员通过 root
将其添加到配置文件中, 才可以用 sudo
sudo
和 直接切换 root
账号是完全不一样的. root
的密码只能由管理员掌握, 不可能让所有人都能登陆 root
, sudo
虽然让指令有 root
权限, 但实际操作的仍然是普通用户, 而非 root
用户.
在 /etc/sudoers
文件里添加一行将用户添加到root
用户组就可以使用 sudo
了
什么是权限呢?
权限一定是让不让做这件事.
在 Linux 下一切皆文件的理念下, 权限就是能不能对文件作出一些操作.即文件权限.
- 文件和文件目录的所有者:
u--User
- 文件和文件目录所有者所在组的用户:
g--Group
- 其他用户:
o--Other
文件可能属于某个人(拥有者), 也可能属于某个组(所属组).
在文件属性列表中, 没有 other, 因为除去 拥有者和所属组就是 other.
那么这个所属组究竟是什么呢?
所属组的存在方便了文件共享, 如果只有拥有者和other, 那么就只会有完全私有和完全公开两个选择. 如果只想文件多属于一个人, 可以直接将其拉入所属组, 这样可以做到部分公开, 组内共享.
Linux 文件类型不通过后缀区分(不代表Linux不用后缀), 对于系统来说, 文件分为以下几种
使用 file
命令, 可以查看文件类型
Linux表示 | 说明 | 八进制表示 |
---|---|---|
r– | 只读 | 4 |
-w- | 仅可写 | 2 |
–x | 仅可执行 | 1 |
rw- | 可读可写 | 6 |
r-x | 可读可执行 | 5 |
-wx | 可写可执行 | 3 |
rwx | 可读可写可执行 | 7 |
— | 无权限 | 0 |
注意
注意: 只有文件拥有者和root才可以改变文件的权限
指令: chmod
格式: chmod [参数] 权限 文件名
常用选项:
R: 递归修改目录文件的权限
(1). 用户表示符 +/-/= 权限字符
+
: 向权限范围增加权限代号所表示的权限
-
: 向权限范围取消权限代号所表示的权限
=
: 向权限范围赋予权限代号所表示的权限
u
: 拥有者 user
g
: 拥有者所属组 group
o
: 其他用户
a
: 所有用户
文件原来的权限属性:
chmod u-r test.c
减去拥有者读权限
chmod u+r,g+rw test.c
加上拥有者读, 所属组读写权限
(2). 三位8进制数字
最高位是拥有者权限
中间位是所属组权限
最低位是其他用户权限
chmod 421 test.c
拥有者有r, 所属组有w, 其他用户有x
验证有无权限的对比表现
这是实验文件本来的权限: 拥有者和所属组都可以读写, 其他用户可以读
但是观察文件属性, 此时所属组仍然有读权限, 本用户属于这个所属组, 却被提示权限不够.
原因是系统在判断当前用户属于哪个角色的时候只会匹配一次, 按照 拥有者 所属组 其他用户的顺序进行匹配.
当前用户 usr_1 第一次就匹配到了拥有者, 只要拥有者没有读权限, 那么 usr_1 就没有读权限.
修改一下该文件的拥有者, 该指令下一段会讲到, 这个时候系统会把 usr_1 匹配成所属组, 文件读取成功
继续操作, 此时显然 test.cpp 没有执行权限, 给拥有者加上 rx
权限
一个文件可以被执行, 不仅需要用户有该文件的执行权限, 还需要文件本身可以执行.
指令: chown
格式: chown [参数] 用户名 文件名
注意如果是普通用户操作, chown
需要有root权限以及验证自己用户的密码
这是文件原来的文件属性
chown usr_2 file.txt
将文件拥有者改为 usr_2
此时如果再想修改文件权限, 就不可以了, usr_1 不是该文件的拥有者.
可以用 chown root:root file.txt
的格式同时修改拥有者和所属组
指令: chgrp
格式: chgrp [参数] 所属组名 文件名
chgrp root file.txt
将文件所属组更改为 root 组
指令: umask
格式: umask 权限值
实例:
umask //查看
umask 044 //设置
有关 umask
细节在下面一段会详细讲解.
可以做个实验, 以此将新创建目录的各权限关闭. 以下所有权限都是相对于拥有者而言的.
去掉目录的 r
权限, 目录可以进入, 但不可以看目录下文件的属性
去掉目录的 w
权限, 目录可以进入, 但不可以在目录下创建和删除文件
Linux 一切皆文件, 目录也是文件, 结合 文件=内容+属性 理解, 目录的内容就是该目录下的文件, 目录的属性就是该目录本身的属性.
总结
r
权限, 不可以看目录下的文件属性w
权限, 不可以创建和删除目录下文件x
权限, 不可以进入目录普通文件的起始权限是 666. (普通文件并不需要执行)
目录文件的起始权限是 775.
系统是通过权限掩码设置文件默认权限的.
可以通过 umask
查看权限掩码
普通用户是 002
, root 用户是 022
文件的默认权限 = 初始权限 &(~umask)
使用 root 用户在普通用户 usr_1 拥有的目录下创建了一个文件
将该文件的所有权限关闭
此时只有目录是属于 usr_1 的, 该用户不可查看, 修改该文件的内容
究其原因, 是因为目录拥有者是该用户, 且该用户有 w 权限
这个特点, 在实现文件共享的时候是致命的.
Linux 系统有一个 /tmp
目录可以进行文件共享, 拥有者和用户组都是 root
因为用户各自目录的权限都只对自己开放, 为了方便用户间共享文件, /tmp
目录对所有用户都开放权限.
先以 usr_1 的身份创建了一个文件, 将其权限放开给所有人
那么这个时候 usr_2 可以删除该文件吗? 答案是不可以.
明明 usr_2 有该目录的 w 权限, 想对目录的文件进行删除, 却不被允许. 再仔细看一下 /tmp
目录的权限属性. 多的.
, 是粘滞位.
这里如果把 /tmp
的粘滞位去掉, usr_2 显然可以删除 usr_1 创建的文件
粘滞位就是为了解决目录的拥有者可以对目录下文件随意删除的致命缺点的.
添加粘滞位指令: 给目录的其他用户权限添加 t
chmod o+t 目录名
这样就能保证只有以下角色可以删除该目录下的文件
本章完.