Linux系统文件属性 用户权限管理 shell 环境变量


一、Linux系统文件

1. 文件的属性

[root@localhost ~]# ll anaconda-ks.cfg
文件类型   权限     硬连接数    文件的大小     文件的创建修改时间
-       rw-------.  1   root root   1379          3月  12 17:43 anaconda-ks.cfg
​
[root@localhost ~]# ll -d zls
文件类型 权限       硬连接数 所属用户 所属用户组 文件的大小   文件的创建修改时间       文件名
d       rwxr-xr-x.   2     root     root     6            3月  12 18:00         zls
第1个字符:表示该文件的类型。
第2~4个字符:表示该文件的属主用户(user)对该文件的访问权限。
第5~7个字符:表示该文件的属组内各成员用户对该文件的访问权限。
第8~10个字符:表示其他任何用户(Other)对该文件的访问权限。
第11个字符:这里的“.”与SELinux有关,目前不必关注。

-:普通文件
d:目录文件
rw- --- --- :权限
rwx r-x r-x :权限
r:读 read
w:写 write
x:执行权限 execute

2. 文件的类型

# 1.普通文件 -
d:directory 目录文件
c:char 字符设备文件
b:block 块设备文件(用来存储数据的设备)
s:socket,安全套接字文件
l:link 软链接文件(快捷方式)
p:pipe 管道文件

"注意:通过颜色或者后缀判断文件类型不一定准确."

# 2.系统链接文件
一个文件分为两部分:
- 真实数据 block:真实数据占用的空间:19G
- 元数据 inode:元数据占用的空间 :9G(用来支持如指示存储位置、历史数据、资源查找、文件记录等功能)

# 3.软链接
软链接相当于windows的快捷方式,软链接文件会将inode指向源文件的block
1.那么当我们对一个文件创建多个软链接时,其实就是多个inode指向同一个block。
2.那么当我们删除软链接文件时,其实只是删除了一个inode的指向,并不会对源文件造成影响。
3.如果我们删除的是源文件,那么该文件的所有软链接文件都会失效。

"软链接的应用场景:"
1)软件升级
2)代码发布
3)不方便移动的目录
4)数据回滚
5)程序读取

# 4.硬链接
文件名和计算机文件系统使用的节点号inode链接起来。因此我们可以用多个文件名与同一个文件进行链接,其中一个修改后,所有与其有硬链接的文件都一起修改了。)

"硬链接和软链接的区别"
1. 创建命令不同
硬链接: ln 文件名
软链接: ln -s 文件名目录名
2. 目录无法创建硬链接,可以创建软链接,硬链接不能跨系统的分区,软链接可以
3. 硬链接文件与源文件的inode号相同,软链接不同
4. 软链接如果删除源文件,所有软链接文件失效,硬链接如果删除源文件,其他硬链接文件均可以使用.

============
每个目录下有隐藏的 “. 当前目录” 和 “..  上级的目录”硬链接
创建一个目录的默认硬链接数,是多少,如果⽬目录硬链接数为10,又是什什么原因?
目录默认硬连接数:2  
下面有8个子目录

3. 相关命令

1.如何查看磁盘的空间大小
df -h

2.如何查看磁盘的inode大小
df -i

3.linux内核引导时,从( /etc/fstab )文件中读取要加载的文件系统信息

4.linux文件属性中每个普通文件用 ( - ) 来标识

5.显示目录(或文件)所占磁盘空间的大小
命令: du (Disk Usage的缩写)
-s 仅显示总计,即当前目录的大小。
-h 以K,M,G为单位,提高信息的可读性。
功能: 显示目录(或文件)所占磁盘空间的大小。
[root@localhost ~]# du -sh /etc/services   
656K    /etc/services

二、Linux的用户管理

Linux支持多个人使用同一个用户登录系统,Windows在修改组策略的情况下,也可以多个人使用同一个用户登录
- 远程连接Linux的方式:SSH协议
- 远程连接Windows的方式:RDP协议

安卓手机(Linux系统):
root 刷机,使用root用户登录系统

1. 登录的用户信息

id [选项] [用户名]
-u:查看用户的uid
-g:查看用户的gid
-G:查看用户的属组

[root@localhost ~]# id
uid=0(root) gid=0(root) 组=0(root)
​
[root@localhost ~]# id qiandao
uid=1001(qiandao) gid=1001(qiandao) 组=1001(qiandao)
​
[root@localhost ~]# id -g cls
1001
[root@localhost ~]# id -u cls
666
[root@localhost ~]# id -G cls
1001
​
[root@localhost ~]# id
uid=0(root)     用户id
gid=0(root)     用户组的id
组=0(root)
​
在系统中,不认识root,qiandao,zls
0:超级用户

uid=1001(qiandao)
gid=1001(qiandao)
groups=1001(qiandao)

2. 用户管理相关文件

  • passwd
# 用户管理相关文件passwd
[root@localhost ~]# ll /etc/passwd
-rw-r--r-- 1 root root 916 3月  30 10:26 /etc/passwd
​
cat /etc/passwd
#用户名 密码占位符 uid   gid   注释信息  用户家目录    用户登录shell
root:   x:        0:    0:     root:   /root:       /bin/bash
cls:    x:      666: 1001:         :   /home/cls:   /bin/bash
wuteng: x:      777: 1001:武藤兰老师: /home/wuteng:  /bin/bash
  • shadow

3. 用户管理相关命令

  • useradd/userdel/usermod
# 创建 useradd [选项] [用户名]
useradd
adduser
默认情况下,在创建用户的时候,会创建一个和用户同名的组,并且把该用户加入该组
useradd zls -u 666 -g 666
创建一个系统 用户,用来管理进程
创建用户时:-g  指定 gid,一定是存在的组

[root@localhost ~]# useradd abc
-u:(uid)指定uid
-g:(gid)指定gid,也可以指定组名
-G:(Group)指定附加组,如果加入多个附加组则用 逗号隔开
-M:不创建家目录   默认 创建家目录
-s:(shell)指定登录的shell             (-s /sbin/nologin)
-c:(comment)添加注释
-d:(directory)指定用户的家目录     /home
-r:帮我们创建一个uid范围是201-999的系统用户,可以登录,但是不创建家目录

# 删除 userdel  [选项] [用户名]
Usage:userdel [选项] [用户名]
默认情况下,在删除用户的同时会把同名的用户组也删除,但是如果组内有其他用户,则不会删除组,只删除用户
-r:删除用户的同时,删除用户的家目录,和用户的其他 邮件目录... (删干净)
(如果账户未删除干净,可以重新创建一个相同用户后在用-r删除一遍。)

# 修改 usermod [选项] [用户名]
-u:修改uid
-g:修改gid
-G:修改附加组
-a:配合-G,在修改附加组的时候,起到追加效果(append)
-m:修改(迁移)家目录,必须配合 -d
-d:指定修改后的家目录
-s:修改登录的shell
-c:修改注释
-l:修改登录的用户名
-L:锁定用户(封号)
-U:解锁用户(解封)

# 创建一个用户,会影响几个文件?
4个文件:
1./etc/passwd   :存放用户信息
2./etc/shadow   :存放密码信息
3./etc/group    :存放用户组信息
4./etc/gshadow  :存放组密码信息
  • id/whoami/who/w/finger
# 用户信息查询命令 id
查看当前登录用户信息
id
查看当前登录用户的uid
id -u
查看gid
id -g
查看组?
id -G

# whoami 查看当前登录的用户
[root@m01 etc]# whoami
root

"用户的其他修改命令(不常用)"
 yum install -y finger

# finger
[root@localhost ~]# finger zls_qwe
Login: zls_qwe                  Name: 曾老湿
Directory: /home/zls_qwe5               Shell: /bin/bash
Office: 十维, +1-234-567-8911     Home Phone: 123-4567
Last login 二 3月 31 09:52 (CST) on pts/0
No mail.
No Plan.

# chfn
[root@localhost ~]# chfn zls_qwe
Changing finger information for zls_qwe.
名称 []: 曾老湿
办公 []: 十维
办公电话 []: 12345678911
住宅电话 []: 1234567

# chsh
Changing shell for zls_qwe.
New shell [/bin/bash]: /sbin/nologin
Shell changed.

"查看用户的登录情况(稍微重要)"
# who    当前有几个用户连接了我的服务器
[root@localhost ~]# who     
登录的用户名  连接的终端     连接的时间          客户端IP
root        pts/0        2020-03-31 09:00 (10.0.0.1)
root        pts/1        2020-03-31 10:15 (10.0.0.1)

# w 
[root@localhost ~]# w

屏幕太小会报错,放大屏幕即可。
 10:33:54 up 1 day, 13:39,  4 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.1         10:33    2.00s  0.00s  0.00s w
root     pts/2    10.0.0.1         10:27    6:08   0.00s  0.00s -bash
root     pts/3    10.0.0.1         10:28    1:30   0.00s  0.00s -bash
root     pts/4    10.0.0.1         10:28    4:58   0.00s  0.00s -bash

4. 用户扩展知识

[root@localhost ~]# cat /etc/login.defs
[root@localhost ~]# grep -i '^[a-z]' /etc/login.defs

=====关于用户的一些配置====
# 指定创建用户后的邮件文件存放位置
MAIL_DIR /var/spool/mail
# 密码,最长天数
PASS_MAX_DAYS 99999
# 密码最小天数
PASS_MIN_DAYS 0
# 密码最小长度
PASS_MIN_LEN    5
# 密码过期前7天 ,提示,密码要过期了,给老子改
PASS_WARN_AGE 7
# 普通用户的uid 最小值1000
UID_MIN                  1000
# 普通用户的最大uid 60000
UID_MAX                 60000
# -r创建的系统用户,201 - 999
SYS_UID_MIN               201
SYS_UID_MAX               999
# 普通用户组的最小gid
GID_MIN                  1000
GID_MAX                 60000
# -r创建的系统用户组,201 - 999
SYS_GID_MIN               201
SYS_GID_MAX               999
# 默认创建家目录
CREATE_HOME yes
# 家目录umask (可修改权限)
UMASK           077
  0777        0777
- 0022        0077
    -------      ------
  0755        0700
# 在删除用户的时候,是否捆绑,把用户组也删除
USERGROUPS_ENAB yes
# 用户密码加密算法
ENCRYPT_METHOD SHA512

======================
[root@localhost ~]# ll /etc/default/useradd
-rw-r--r-- 1 root root 119 11月  5 2016 /etc/default/useradd
​
[root@localhost ~]# cat /etc/default/useradd
# 依赖于/etc/login.defs的USERGRUUPS_ENAB参数,如果为no,则在此处控制
GROUP=100
# 默认普通用户的家目录
HOME=/home
# 是否启用账号过期停权,-1表示不启用
INACTIVE=-1
# 账号终止日期(没有设置)
EXPIRE=
# 创建用户的默认shell
SHELL=/bin/bash
# 当用户,误删除了自己家目录下的环境变量。可以重新拷贝一个到家目录下
SKEL=/etc/skel
-bash-4.2$    cp /etc/skel/.bash* ~/

# 创建用户的同时,是否创建邮件文件
CREATE_MAIL_SPOOL=yes

5. 用户的密码相关

  • passwd密码管理
# 创建密码的规范
1.密码的长度最好大于10位字符
2.密码中包含大小写字母数字以及特殊字符 ! @ # 3.不规则性(不要出现自己名字、公司名字、自己电话、等等简单的密码)

[root@localhost ~]# passwd --help
用法: passwd [选项...] <帐号名称>

============
1.直接输入passwd,更改当前登录用户的密码
[root@localhost ~]# passwd

2.passwd + 用户名,给指定用户设置密码
[root@localhost ~]# passwd zls000  (然后会提示输入密码)

3.使用非交互的方式设置密码给指定用户
[root@localhost ~]# echo '123' | passwd --stdin zls000

===========
例:创建出来100个 用户,并且设置100个随机密码,并且记录密码,都可以登录
useradd xxx001 && pass=`echoRANDOM|md5sum|cut -c 1-10` && echo pass  |passwd --stdin xxx001 && echo xxx001:pass >> /tmp/a.pass
  • md5sum加密并且做校验
给用户设置密码并加密校验
echo $RANDOM|md5sum|cut -c 1-10  |passwd --stdin xxx001
  • mkpasswd密码工具
mkpasswd密码生成工具
-l设定密码长度,-d数子,-c小写字母,-C大写字母,-s特殊字符
[root@zls ~]# yum install -y expect      //需要安装扩展包
[root@zls ~]# mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4
|K&13bR)i/

6. Linux的组管理

# 组的基本管理
[root@localhost ~]# ll /etc/group
-rw-r--r-- 1 root root 12120 4月   1 10:11 /etc/group

[root@localhost ~]# tail -2 /etc/group
hfls49:x:1779:
hfls50:x:1780:
第一列:组名
第二列:密码占位符(组密码存在gshadow)
第三列:gid
第四列:组的附加成员,基本成员不显示。
​
[root@localhost ~]# ll /etc/gshadow
---------- 1 root root 8902 4月   1 10:11 /etc/gshadow
​
[root@localhost ~]# tail -2 /etc/gshadow
hfls49:!::
hfls50:!::
第一列:组名
第二列:组密码(!! 表示没有密码)
第三列:组管理员
第四列:组的附加成员,基本成员不显示
​
# 创建组命令:groupadd
groupadd z1s
groupadd z1s -g 6666

# 创建gid范围是201-999之间的系统组
groupadd -r z1s
​
# 修改组命令:groupmod
groupmod z1s -g 6666

# 修改组名
groupmod z1s -n z1s01

# 删除组命令:groupdel
groupdel z1s01

三、环境变量文件

1. 个人环境变量

~/.bash_profile
~/.bashrc

[root@localhost ~]# ll ~/.bashrc
-rw-r--r-- 1 root root 176 Mar 25 10:55 /root/.bashrc

[root@localhost ~]# ll ~/.bash_profile
-rw-r--r--. 1 root root 176 Dec 29  2013 /root/.bash_profile

2. 全局环境变量:

/etc/profile
/etc/profile.d/*.sh
/etc/bashrc

四、Shell 和 Bash

  • shell:一种人机交互的壳层与命令行界面
  • bash:Unix shell的一种

1. 版本和提示符

2. shell的分类

  • 交互式shell 和系统一问一答。类似于passwd命令
    等待用户输入执行的命令(终端操作,需要不断提示)
  • 非交互式shell 输入后直接出现结果,不需要交互
    执行shell脚本, 脚本执行结束后shell自动退出,和一部分命令
  • 登录式shell 输入密码登录,类似于 su - root
    需要输入用户名和密码。才能进入shell su - root
  • 非登录式shell 不需要输入用户和密码进入
    不需要输入用户和密码就能进入,比如执行sh, bash, su username
# 登录式shell配置文件执行顺序
/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc

# 非登陆式shell配置文件执行顺序
~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh

五、用户身份切换

  • su
  • sudo

1. su切换用户

如何在普通用户的情况下,完成日常工作?
1)su 切换用户,使用普通用户登录,然后使用su命令切换到root。
优点:简单,方便
su -> root
缺点:需要知道root密码,不安全,切换到root没有日志审计功能

2)sudo 提权,当需要使用root权限时,进行提权,而无需切换至root用户。
优点:安全,方便
缺点:复杂
-c:不切换用户的情况下,直接执行命令

2. sudo用户身份提权

# sudo 提权 (需要建立一个提权的命令列表文件)
usermod zls -G wheel
1.将用户加入到 sudoers 文件中
2.将用户加入到 sudoers 文件中设置的组里

[root@localhost ~]# visudo
1.用户名      2.主机名   3.角色名       4.命令名
root            ALL=   (ALL)           ALL

visudo  = vim /etc/sudoers
username ALL=(ALL) ALL
username ALL=(ALL) ALL,!/bin/su,!/bin/vim,!/bin/vi,!/bin/rm,/bin/ifconfig,/bin/netstat

3. sh的权限问题

  • 为什么Linux中sh执行脚本命令没有权限也能正常执行

sh+脚本名称,可以不必事先设定shell的执行权限。因为这个是将test.sh作为参数传给sh(bash)命令来执行的。这时不是test.sh自己来执行,而是被人家调用执行,所以不要执行权限。

如果直接运行test.sh,就会报权限问题:
[root@web01 ~]# ./test.sh 
-bash: ./test.sh: Permission denied

六、系统权限管理

  • Linux 系统,最常见的文件权限有 3 种,即对文件的读(用 r 表示)、写(用 w 表示)和执行(用 x 表示,针对可执行文件或目录)权限。在 Linux 系统中,每个文件都明确规定了不同身份用户的访问权限,通过 ls 命令即可看到。

  • 除此之外,我们有时会看到 s(针对可执行文件或目录,使文件在执行阶段,临时拥有文件所有者的权限)和 t(针对目录,任何用户都可以在此目录中创建文件,但只能删除自己的文件),文件设置 s 和 t 权限,会占用 x 权限的位置。

1. rwx-权限

例如,我们以 root 的身份登陆 Linux,并执行如下指令:
[root@localhost ~]# ls -al
total 156
drwxr-x---.   4    root   root     4096   Sep  8 14:06 .
drwxr-xr-x.  23    root   root     4096   Sep  8 14:21 ..
-rw-------.   1    root   root     1474   Sep  4 18:27 anaconda-ks.cfg
-rw-------.   1    root   root      199   Sep  8 17:14 .bash_history
-rw-r--r--.   1    root   root       24   Jan  6  2007 .bash_logout
...
可以看到,每行的第一列表示的就是各文件针对不同用户设定的权限,一共 11 位,但第 1 位用于表示文件的具体类型,最后一位此文件受 SELinux 的安全规则管理.

因此,为文件设定不同用户的读、写和执行权限,仅涉及到 9 位字符,以 ls 命令输出信息中的 .bash_logout 文件为例,设定不同用户的访问权限是 rw-r--r--,各权限位的含义如图 1 所示。

从图中可以看到,Linux 将访问文件的用户分为 3 类,分别是文件的所有者,所属组(也就是文件所属的群组)以及其他人。

r:read (读)  4
w:write (写) 2
x:exec(执行) 1
-:没有权限   0

u:user(用户)
g:group(用户组)
o:other(其他用户)

2. 修改文件目录权限 chmod

# 数字方式修改
[root@localhost ~]# chmod 777 a.sh
-R:递归授权(递归修改属组和属主)
​
# 字母方式修改
[root@localhost ~]# chmod a=rwx zls_quanxian      (a代表all)
[root@localhost ~]# chmod u=rwx zls_quanxian
[root@localhost ~]# chmod g=rw zls_quanxian
[root@localhost ~]# chmod o=rx zls_quanxian
[root@localhost ~]# chmod u=rwx,g=rw,o=r zls_quanxian
​
# UGO方式修改(增加或减少权限)
[root@localhost ~]# chmod o-x a.sh
[root@localhost ~]# chmod u-w a.sh
[root@localhost ~]# chmod g-r a.sh
[root@localhost ~]# chmod u+x a.sh
[root@localhost ~]# chmod -x zls123
[root@localhost ~]# chmod +x zls123

3. 权限对目录和文件的不同作用

"rwx 权限对文件的作用"
# 读权限(r) 
表示可读取此文件中的实际内容,例如,可以对文件执行 cat、more、less、head、tail 等文件查看命令。

# 写权限(w) 
表示可以编辑、新增或者修改文件中的内容,例如,可以对文件执行 vim、echo 等修改文件数据的命令。注意,无权限不赋予用户删除文件的权利,除非用户对文件的上级目录拥有写权限才可以。

# 执行权限(x) 
表示该文件具有被系统执行的权限。Window系统中查看一个文件是否为可执行文件,是通过扩展名(.exe、.bat 等),但在 Linux 系统中,文件是否能被执行,是通过看此文件是否具有 x 权限来决定的。也就是说,只要文件拥有 x 权限,则此文件就是可执行文件。但是,文件到底能够正确运行,还要看文件中的代码是否正确。

对于文件来说,执行权限是最高权限。给用户或群组设定权限时,是否赋予执行权限需要慎重考虑,否则会对系统安装造成严重影响。

"rwx 权限对目录的作用"
# 读权限(r) 
表示具有读取目录结构列表的权限,也就是说,可以看到目录中有哪些文件和子目录。一旦对目录拥有 r 权限,就可以在此目录下执行 ls 命令,查看目录中的内容。

# 写权限(w) 
对于目录来说,w 权限是最高权限。对目录拥有 w 权限,表示可以对目录做以下操作:在此目录中建立新的文件或子目录;删除已存在的文件和目录(无论子文件或子目录的权限是怎样的);对已存在的文件或目录做更名操作;移动此目录下的文件和目录的位置。一旦对目录拥有 w 权限,就可以在目录下执行 touch、rm、cp、mv 等命令。

# 执行权限(x) 
目录是不能直接运行的,对目录赋予 x 权限,代表用户可以进入目录,也就是说,赋予 x 权限的用户或群组可以使用 cd 命令。

对目录来说,如果只赋予 r 权限,则此目录是无法使用的。很简单,只有 r 权限的目录,用户只能查看目录结构,根本无法进入目录(需要用 x 权限),更不用说使用了。
因此,对于目录来说,常用来设定目录的权限其实只有 0(---)、5(r-x)、7(rwx)这 3 种。

=========================
# rwx权限对文件的影响
r:文件可以读取内容,不能写,不能执行
w:文件可以写入内容,但是追加只能>>,不能vim,因为不能读取内容,所以不能修改文件内容,只能覆盖
x:啥也不能干,因为没有读权限。所以无法执行文件中的内容
rw:可读,可写,不能执行
rx:可读,可执行,不能写
rwx:可读,可写,可执行
注意:文件的rwx权限,只能针对文件内容,如果想要删除,或者移动,那么跟文件所在目录的权限有关

# rwx权限对目录的影响
r:可以查看目录下所有的文件名,但是看不见文件的详细信息
rx:加上x权限,就可以看见文件的详细信息了
w:啥也不是
wx:可以创建,可以删除,不能查看
rw:可以查看目录下的文件,但是不能删除,不能移动,不能拷贝
rwx:删除文件,创建文件,移动文件,拷贝文件,查看
x:啥也不是
-rwxr-x--- 1 zls qiandao   0 4月   2 12:10 aaaa
zls用户: rwx
qiandao组: rx
其他用户:没有任何权限
========================

4. 权限核心原理

  • 文件的可用权限
# 初学权限的时候,可能对两种情况最不能理解,我们一个一个来看:
为什么对文件有写权限,却不能删除文件?
这需要通过分区的格式化来讲解。我们之前讲过,分区的格式化可以理解为给分区打入隔断,这样才可以存储数据。

在 Linux 的 ext 文件系统中,格式化可以理解为把分区分成两大部分:
一部分占用空间较小,用于保存 inode(i 节点)信息;绝大部分格式化为 block(数据块),用于保存文件中的实际数据。
在 Linux 中,默认 inode 的大小为 128 Byte,用于记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件中的数据真正保存的 block 编号。每个文件需要占用一个 inode。

仔细观察,在 inode 中并没有记录文件的文件名。那是因为文件名是记录在文件上级目录的 block 中的。我们画一张示意图看看,假设有这样一个文件 /test/cangls,如图 1 所示。

我们可以看到,在 /test/ 目录的 block 中会记录这个目录下所有的一级子文件或一级子目录的文件名及其对应的 inode 好。也就是说,系统读取 cangls 文件的过程是这样的:
1.通过 /test/ 目录的 inode 信息,找到 /test/ 目录的 block。
2.在 /test/ 目录的 block 中,查看到 cangls 文件的 inode 号。
3.通过 cangls 文件的 inode 号,找到了 cangls 文件的 inode 信息。
4.确定是否有权限访问 cangls 文件的内容。
5.通过 inode 信息中 block 的位置,找到 cangls 文件实际的 block。
6.读取 block 数据,从而读取出 cangls 文件的内容。
7.既然如此,那么 /test/ 目录的文件名放在哪里呢?当然放在 / 目录的 block 中了,而/目录的 inode 号(/ 目录的 inode 号是 2)是系统已知的。也就是说,在系统中读取任意一个文件,都要先通过 / 目录的 inode 信息找到 / 目录的 block,再查看 / 目录的 block,从而可以确定一级目录的 inode 信息。然后一级一级地查找到最终文件的 block 信息,从而读取数据。

总结:因为文件名保留在上级目录的 block 中,所以对文件拥有写权限,是不能删除文件本身的,只能删除文件中的数据(也就是文件 block 中的内容)。要想删除文件名,需要对文件所在目录拥有写权限。
  • 目录的可用权限
对目录来讲,如果只赋予只读(r)权限,则是不可以使用的。大家想想,要想读取目录下的文件,你怎么也要进入目录才可以吧?而进入目录,对目录来讲,需要执行(x)权限的支持。

目录的可用权限其实只有以下几个:
    0:任何权都不赋予。
    5:基本的目录浏览和进入权限。
    7:完全权限。

# 示例:
    我们做权限的实验,是不能使用 root 用户测试的。由于 root 用户是超级用户,就算没有任何权限,root 用户依然可执行全部操作。
    所以我们只能使用普通用户来验证权限,而目前普通用户又不能修改文件权限(不是普通用户不能修改文件权限,而是只有文件的所有者才能修改文件权限,我们当前没有讲修改所有者的命令,从而导致普通用户不能修改文件权限)。在实验中,笔者会用 root 用户来修改文件权限,而用普通用户 user 来验证权限,请大家注意用户身份的变化。
    实验思路:由 root 用户把测试目录和测试文件的权限改为最小(0),然后逐步放大权限,用普通用户来验证每个权限可以执行那些命令。
    创建普通用户 user 的简单步骤:第一步,添加用户执行命令"useradd user";第二步,设置用户密码 "passwd user",输入两次密码确认。

    #步骤一:
    由root身份建立测试文件
    [root@localhost ~]# cd /home/user/
    进入普通用户的家目录中建立测试目录和文件,因为普通用户无法进入root的家目录中

    [root@localhost user]# mkdir test
    [root@localhost user]# touch test/cangls
    建立测试目录和文件

    [root@localhost user]# chmod 750 test/
    修改test目录的权限为750

    由于没有修改所有者和所属组,所以user用户会匹配其他人权限
    为了实验效果,只把他人的权限改为0,而所有者和所属组权限不修改
    [root@localhost user]# chmod 640 test/cangls 
    修改cangls文件的权限为640

    #步骤二:
    由user用户测试权限(执行命令"su-user"切换用户)
    [user@localhost ~]ll
    总用量 4
    drwxr-x—-- 2 root root 4096 6月 15 13:19 test
    "思考:为什么user对test目录没有权限,却能看到 test目录?"

    [user@localhost ~] ls test/
    ls:无法打开目录test/:权限不够

    [user@localhost ~]cd test/
    -bash: cd: test/:权限不够
    由于user用户对test目录没有权限(0),
    所以既不能查看目录下的内容,也不能进入目录

    #步骤三:
    由root用户给test目录赋予读(r)权限
    [root@localhost user]# chmod 754 test
    [root@localhost user]# ll test/
    总用量0
    -rw-r----- 1 root root 0 6月 15 13:19 cangls
    "注意,这是测试实验,只读(r)权限对目录无法正常使用"

    #步骤四:
    由user用户测试,读(r)权限虽然可以看到目录下的内容,但是不能正常使用
    [user@localhost ~] ls test/
    ls:无法访问test/cangls:权限不够
    cangls
    ls查看目录下的内容,虽然看到了文件名,但依然报错"权限不够"

    [user@localhost ~]ll test/
    ls:无法访问test/cangls:权限不够
    总用量0
    -????????? ???? ? cangls
    ll查看目录下的内容,会发现由于权限不足,所以只能看到文件名,其他信息都是"?",代表不能正常查看

    [user@localhost ~] cd test/
    -bash: cd: test/:权限不够
    当然也不能进入目录
    所以,只读(r)权限对目录来说是无法正常使用的权限

    #步骤五:
    由root用户给test目录赋予读(r)和执行(x)权限
    [root@localhost user]# chmod 755 test

    [root@localhost user]# ll test/
    总用量0
    -rw-r—---- 1 root root 0 6月 15 13:19 cangls
    读(r)和执行(x)权限对目录来说才是可以正常使用的权限

    #步骤六:
    由user用户测试
    [user@localhost ~]ll test/
    总用量0
    -rw-r—---- 1 root root 0 6月 15 13:19 cangls
    可以正常查看目录下的内容

    [user@localhost ~] cd test/
    [user@localhost test]可以进入目录了

    #步骤七:
    我们开始测试文件权限,由user用户测试
    [user@localhost test] cat cangls
    cat: cangls:权限不够
    user用户没有读(r)权限,所以不能查看文件的内容

    [user@localhost test]echo 22222 >> cangls-bash: cangls:权限不够
    user用户没有写(w)权限,所以不能写入数据

    #步骤八:
    由root用户给cangls文件赋予读(r)权限
    [root@localhost user]# chmod 644 test/cangls

    #步骤九:
    由user用户测试,可以读取cangls文件的内容
    [user@localhost test] cat cangls
    [user@localhost test]虽然文件为空,但是不再报错

    [user@localhost test] echo 22222 >> cangls
    -bash: cangls:权限不够
    由于没有写权限,所以依然不能向文件中写入数据

    #步骤十:
    由root用户给cangls文件赋予写(w)权限
    [root@localhost user]# chmod 646 test/cangls
    这只是实验,才会出现其他人权限高于所属组权限的情况,实际情境不会这样

    #步骤十一:
    由user用户测试,可以对cangls文件写入数据
    [user@localhost test]echo 22222 >> cangls
    [user@localhost test] rm -rf cangls
    rm:无法删除"cangls":权限不够
    可以对cangls文件写入数据,但是不能删除这个文件本身

    #步骤十二:
    由root用户给test目录赋予写(w)权限
    [root@localhost user]# chmod 757 test/
    [root@localhost user]# ll
    总用量4
    drwxr-xrwx 2 root root 4096 6月 15 13:19 test
    其他用户赋予7权限,非常不安全,在生产环境下严格禁用

    #步骤十三:
    由user用户测试,可以删除cangls文件,并且可以新建、复制和剪切
    [user@localhost test]rm -rf cangls
    可以删除

    [user@localhost test] touch bols
    可以新建bols文件

    [user@localhost test]$ mv bols Imls
    可以把bols文件改名为lmls

# 这个实验并不复杂,但是由于需要在两个用户身份之间切换,所以代码确实比较长。这个实验可以充分说明每个权限可以执行哪些命令,可以帮助我们更好地理解权限的含义。

5. Linux特殊权限介绍

[root@www ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月  10 2014 /usr/bin/passwd
[root@www ~]# ll /usr/bin/write
-rwxr-sr-x. 1 root tty 19624 4月  11 2018 /usr/bin/write
[root@www ~]# ll /tmp/ -d
drwxrwxrwt. 9 root root 4096 4月   3 09:49 /tmp/

# 1. SUID (相当于某些特殊情况下的提权)
全拼:set uid
在属主权限位上,本来应该是x执行权限出现了一个s
一般是针对可执行文件
如果一个可执行文件,在属主权限位的x位上有s权限,那么证明该文件有set uid特殊权限。
set uid:任何用户(除了root外)执行具有suid权限的文件时,会以该文件属主的身份去执行

'SUID授权'
# chmod ugo方式
[root@www ~]# chmod u+s 文件或目录
​
# chmod number方式 4000
[root@www ~]# chmod 4755 aaaa
[root@www ~]# chmod 4000 aaaa
​
注意:当授权文件,原本属主位上有x权限时,是s,原本属主位上没有x权限时,是S


# 2. SGID
全拼:set gid权限
在属组权限位上,本来应该是x执行权限出现了一个s
一般是针对目录,也有可执行文件(大部分针对目录)
[root@www ~]# ll /usr/bin/write
-rwxr-sr-x. 1 root tty 19624 4月  11 2018 /usr/bin/write
1.针对用户组权限位修改,用户创建的目录或文件所属组和该目录的所属组一致。
2.当某个目录设置了sgid后,在该目录中新建的文件不在是创建该文件的默认所属组
3.使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单。
主要目的:用于共享目录

'SGID授权方式'
# chmod ugo方式
[root@www ~]# chmod g+s /tmp/test/
​
# chmod number方式 2000
[root@www ~]# chmod 2000 3
注意:当授权文件,原本属组位上有x权限时,是s,原本属组位上没有x权限时,是S

# 3. SBIT(粘滞位)
sticky(SI TI KI)粘滞
在其他用户权限位上,本来应该是x执行权限出现了一个t
普通用户对该目录拥有w和x权限,即普通用户可以在此目录中拥有写入权限,如果没有粘滞位,那么普通用户拥有w权限,就可以删除此目录下的所有文件,包括其他用户简历的文件。但是一旦被赋予了粘滞位,除了root可以删除所有文件,普通用户就算有w权限也只能删除自己建立的文件,而不能删除其他用户简历的文件。
系统中存在的/tmp目录是经典的粘滞位目录,谁都有写权限,因此安全成问题,常常是木马第一手跳板。

'SBIT授权方式'
# chmod ugo 方式
[root@www ~]# chmod o+t SB
​
# chmod number方式
[root@www ~]# chmod 1755 IT
注意:当授权目录,原本其他用户权限位上有x权限时,是t,原本其他用户权限位上没有x权限时,是T

6. 命令权限中的''慈禧''chattr

'当创建一个用户的时候:'
1.创建用户   信息记录到 > /etc/passwd
1.1 用户相关的密码 记录到 > /etc/shadow
2.创建用户组 信息记录到 > /etc/group
2.1 用户组相关的密码 记录到 > /etc/gshadow
​
chattr 枷锁(root都无法操作被chattr命令加锁的文件)
i:上锁,什么都不能做,只能看
a:只能看和追加内容(不能覆盖)

lsattr 查看额外的权限

加锁:chattr +i  /etc/passwd       文件不能删除,不能更改,不能移动
查看加锁: lsattr /etc/passwd      文件加了一个参数 i 表示锁定
解锁:chattr -i /home/omd/h.txt    - 表示解除

7. Linux系统进程掩码 UMASK

[root@www ~]# umask
0022  (一般默认值)
​
mkdir dir
0777
0022
----
0755
​
touch file
0666
0022
----
0644

​当umask计算中出现奇数时:目录计算方式不变,但是文件的奇数位的结果要+1
[root@www ~]# umask 0033
[root@www ~]# umask
0033
​
dir:744
file:644
​
[root@www ~]# umask 0011
dir:766
file:666
​
0777
0011
----
0766
​
0666
0011
----
0655
0666

[root@www ~]# umask 0045
dir:732
0777
0045
----
0732

file:622
0666
0045
----
0622

Copyright © 2009 - Now . XPBag.com . All rights Reserved.
夜心的小站 » Linux系统文件属性 用户权限管理 shell 环境变量

提供最优质的资源集合

立即查看 了解详情