Linux学习笔记--8(文件权限)

2023-11-13

文件权限与归属

Linux不同的字符来区分文件类型。常见如下:
-:普通文件
d:目录文件
l:链接文件
b:块设备文件
c:字符设备文件
p:管道文件
对应目录文件,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”表示能够进入该目录。
文件的读、写、执行权限简写为rwx,数字分别4、2、1表示。文件所有者,所属组及其他用户权限之间无关联
文件权限的字符与数字表示在这里插入图片描述
在这里插入图片描述

特殊权限:特殊权限构成了除基本用户,组和其他类型之外的第四种权限类型。
特殊权限对文件和目录的影响
在这里插入图片描述

umask

umask进一步限制初始设置的权限,用于清除由该进程创建的新文件和目录的权限。
如在umask中设置了一个位,则新文件中对应的权限将被清除。
如:umask 0022则 根据目录是777 减去 umask,所有默认的目录是755,同样文件666 减去 umask 则文件是644。前导零表示特殊的用户和组权限未被清除。
umask 0777时,清除新创建文件的所有组和其他权限

uxprobe ~]# umask
0022
[root@linuxprobe ~]# touch file
[root@linuxprobe ~]# ll file
-rw-r--r--. 1 root root 0 Apr 18 21:50 file
[root@linuxprobe ~]# mkdir test
[root@linuxprobe ~]# ls -ald test
drwxr-xr-x. 2 root root 6 Apr 18 21:51 test
[root@linuxprobe ~]# 

SUID

SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
用户密码保存在/etc/shadow文件中。
在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。
查看passwd命令属性时发现所有者得权限由rwx变成了rws,其中x变成了s意味着该文件被赋予了SUID权限。如果原本的权限是rw-,原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。
在这里插入图片描述

SGID

SGID主要实现两种功能:
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
如:在某个目录中创建文件自动继承该目录的用户组
在这里插入图片描述
上述命令是设置好目录777权限(确保普通用户可以向其写入文件),并设置了SGID 特殊权限位。下面切换普通用户,并在该目录中创建文件,查看是否继承新创建的文# 件所在的目录的所属组名称。
在这里插入图片描述

chmod 命令

chmod是用来设置文件或目录的权限,格式为“chmod [参数] 权限 文件或目录名称”, 通过数字chmod ### file|directory
chmod WhoWhatWhich file|directory
Who : 指的是u,g,o,a(代表用户,组,其他,全部)
What: 指的是+,-,=(代表添加,删除,精确)
Which: 指的是r,w,x(代表读取,写入,执行)
如:

[root@linuxprobe ~]# ll file
-rw-r--r--. 1 root root 0 Apr 18 21:50 file
[root@linuxprobe ~]# chmod 760 file
[root@linuxprobe ~]# ll file
-rwxrw----. 1 root root 0 Apr 18 21:50 file
root@linuxprobe ~]# chmod 777 file
[root@linuxprobe ~]# ll file
-rwxrwxrwx. 1 root root 0 Apr 18 22:03 file
[root@linuxprobe ~]# chmod go-rw file
[root@linuxprobe ~]# ll file
-rwx--x--x. 1 root root 0 Apr 18 22:03 file
[root@linuxprobe ~]# chmod 000 file
[root@linuxprobe ~]# ll file
----------. 1 root root 0 Apr 18 22:03 file
[root@linuxprobe ~]# chmod a+x file
[root@linuxprobe ~]# ll file
---x--x--x. 1 root root 0 Apr 18 22:03 file
[root@linuxprobe ~]# 

chown 命令

chown是设置文件或目录的所有者和所属组,格式为“chown [参数] 所有者:所属组 文件或目录名称”
chmod和chown共性,就是针对目录进行操作时需要加上大写参数-R表示递归。
如:下面file文件的修改,结果是所有者为root和所属组为bin

[root@linuxprobe ~]# ll file
---x--x--x. 1 root root 0 Apr 18 22:03 file
[root@linuxprobe ~]# chown root:bin file 
[root@linuxprobe ~]# ll file
---x--x--x. 1 root bin 0 Apr 18 22:03 file
[root@linuxprobe ~]# 

SBIT

SBIT(粘滞位)特殊权限位可确保用户只删除自己的文件,而不能删除其他用户的文件。
当目录被设置SBIT特殊权限后,文件其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。
其实文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限。

如:建立两个测试用户,一个用户建立文件给最大权限,别的用户是无法删除的。

[root@linuxprobe ~]# useradd zhangsan 
[root@linuxprobe ~]# useradd lisi
[root@linuxprobe ~]# id zhangsan 
uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan)
[root@linuxprobe ~]# id lisi 
uid=1002(lisi) gid=1002(lisi) groups=1002(lisi)
[root@linuxprobe ~]# su - zhangsan
[zhangsan@linuxprobe ~]$ ls -ald /tmp
drwxrwxrwt. 19 root root 4096 Apr 18 22:21 /tmp
[zhangsan@linuxprobe ~]$ cd /tmp
[zhangsan@linuxprobe tmp]$ echo "testnihao" > tt.txt
[zhangsan@linuxprobe tmp]$ chmod 777 tt.txt
[zhangsan@linuxprobe tmp]$ ll tt.txt
-rwxrwxrwx. 1 zhangsan zhangsan 10 Apr 18 22:22 tt.txt
[zhangsan@linuxprobe tmp]$ su - lisi
Password: 
Password: 
su: Authentication failure
[zhangsan@linuxprobe tmp]$ exit
logout
[root@linuxprobe ~]# su - lisi
[lisi@linuxprobe ~]$ cd /tmp
[lisi@linuxprobe tmp]$ rm -f tt.txt
rm: cannot remove 'tt.txt': Operation not permitted
[lisi@linuxprobe tmp]$ 

要是也想对其他目录来设置SBIT特殊权限位,用chmod命令就可以了。对应的参数o+t代表设置SBIT粘滞位权限
在这里插入图片描述
SUID、SGID、SBIT特殊权限的设置参数
在这里插入图片描述
其实,SUID、SGID与SBIT也有对应的数字表示法,分别为4、2、1。也就是说777还不是最大权限,最大权限应该是7777,其中第1个数字代表的是特殊权限位。既然知道了数字表示法是由“特殊权限+一般权限”构成的。
如果权限是“rwsrwSr–”呢?首先不要慌,大写S表示原先没有执行权限,因此一般权限为rwxrw-r–,将其转换为数字表示法后结果是764。带有的SUID和SGID特殊权限的数字法表示是4和2,心算得出结果是6,合并后的结果为6764。
在这里插入图片描述
将权限的数字表示法转换成字符表示法的难度略微高一些,这里以5537为例讲解。首先,特殊权限的5是由4+1组成的,意味着有SUID和SBIT。SUID和SGID的写法是,原先有执行权限则是小写s,如果没有执行权限则是大写S;而SBIT的写法则是,原先有执行权限是小写t,没有执行权限是大写T。一般权限的537进行字符转换后应为r-x-wxrwx,然后在此基础上增加SUID和SBIT特殊权限,合并后的结果是r-s-wxrwt。
在这里插入图片描述

文件的隐藏属性

chattr命令

chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。
如果把某隐藏文件添加到文件上,命令后追加“+参数”,某隐藏功能移出文件,则追加
“-参数”。
chattr命令中用于隐藏权限的参数及作用
在这里插入图片描述
如:chattr +a file ; 取消用: chattr -a file

[root@linuxprobe ~]# ll file
---x--x--x. 1 root bin 0 Apr 18 22:03 file
[root@linuxprobe ~]# chattr +a file
[root@linuxprobe ~]# lsattr file
-----a------------ file
[root@linuxprobe ~]# chattr -a file
[root@linuxprobe ~]# lsattr file
------------------ file
[root@linuxprobe ~]# 

lsattr命令

lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。在linux中,文件的隐藏权限必须使用lsattr命令查看,ls命令则看不出。

[root@linuxprobe ~]# chmod 777 file
[root@linuxprobe ~]# ll file
-rwxrwxrwx. 1 root bin 0 Apr 18 22:03 file
[root@linuxprobe ~]# chattr +a file
[root@linuxprobe ~]# ll file 
-rwxrwxrwx. 1 root bin 0 Apr 18 22:03 file
[root@linuxprobe ~]# lsattr file
-----a------------ file
[root@linuxprobe ~]# rm -f file
rm: cannot remove 'file': Operation not permitted
[root@linuxprobe ~]# chattr -a file
[root@linuxprobe ~]# rm -f file
[root@linuxprobe ~]# 

文件访问控制列表

如果对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)。
基于普通文件或目录设置ACL就是针对指定的用户或用户组设置文件或目录的操作权限。如目录设置了ACL,则目录中文件会继承ACL;如文件设置了ACL,则文件不在继承其所在目录的ACL。

setfacl命令

setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”
setfacl命令中的参数以及作用
在这里插入图片描述
添加或修改用户ACL或指定用户ACL:X表示后面文件是目录才会执行,不然不会
setfacl -m -u:name:rwX file
添加或修改组ACL或指定组ACL:
setfacl -m g:name:rwx file
添加或修改其他ACL:
setfacl -m o::- file
用同一个命令添加多个条目,用逗号分隔条目列表:
setfacl -m u::rwx,g:consultants:rX,o::- file
如:设置用户在/root目录上的权限
查看文件上有哪些ACL,ls命令是看不到ACL表信息的,但是可以看到文件的权限最 后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL。

[root@linuxprobe ~]# ls -ald /root
dr-xr-x---. 17 root root 4096 Apr 18 22:38 /root
[root@linuxprobe ~]# setfacl -m u:linuxprobe:rwx /root
[root@linuxprobe ~]# ls -ald /root
dr-xrwx---+ 17 root root 4096 Apr 18 22:38 /root
[root@linuxprobe ~]# 

getfacl命令

getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”
如:用getfacl显示在root管理员家目录上设置的所有ACL信息

[root@linuxprobe ~]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:linuxprobe:rwx
group::r-x
mask::rwx
other::---

[root@linuxprobe ~]# 

getfacl /root(结果中有条记录user:linuxprobe:rwx,即上面设置的)
描述 ACL操作
显示目录上的ACL getfacl /directory
具有文件读取和执行权限的指定用户 user:mary:rx file
具有文件读取和执行权限的文件所有者 user::rx file
授予目录组所有者的目录读取和写入权限 g::rw /directory
授予文件组所有者的文件读取和写入权限 g::rw file
授予指定组的目录读取、写入和执行权限 group:hug:rwx /directory
设置为默认掩码的读取和执行权限 defaultⓂ️:rx /directory
获得新文件初始读取权限、新子目录读取和执行权限的指定用户 defalut:user:mary:rx /directory
getfacl作为setfacl的输入:
getfacl file-A | setfacl --set-file=- file-B ( --set-file可接受来自文件或stdin的输入)

su命令与sudo服务

su命令可以解决切换用户身份的需求,强烈建议在切换用户身份时添加减号(-)。这个意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息。
sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为“sudo [参数] 命令名称”

sudo命令中的可用参数以及作用 在这里插入图片描述
总结来说,sudo命令具有如下功能:
限制用户执行指定的命令;
记录用户执行的每一条命令;
配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
验证密码的后5分钟内(默认值)无须再让用户再次验证密码
如果担心直接修改配置文件出现问题,则用visudo命令来配置用户权限。这个命令在配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
注:只有root管理员才可以使用visudo命令编辑sudo服务的配置文件。
如:在第99行填信息
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL
然后切换到普通用户,就可以sudo -l查看所有可执行的命令。
在实际生产中不允许某个普通用户拥有整个系统的所有命令最高执行权,因此上面的ALL参数就有些不适合了。
注:让某用户使用root管理员身份执行指定的命令,一定要给出该命令的绝对路径。
可以用whereis查看命令的绝对路径,比如cat,whereis cat
可以把上面99行改成:
99 linuxprobe ALL=(ALL) /usr/bin/cat
保存后,su – linuxprobe
cat /etc/shadow(结果是没有权限打开)
sudo cat /etc/shadow (可以看到里面的内容了)
注:上面每次sudo都要验证下密码,可以添加NOPASSWD参数,使得用户执行sudo命令时不再需要密码验证。linuxprobe ALL=NOPASSWD : /usr/sbin/poweroff

照片见证

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux学习笔记--8(文件权限) 的相关文章

随机推荐

  • 2-问过 chatgpt 的问题(天马行空想问什么问什么)

    目录 一 信号序列中大部分为 0 时 FFT 运算复杂度的计算 1 当fft运算时 大部分信号点为0的情况下 对fft的运算时间会有影响吗 2 大部分信号点为0的情况下 fft的运算复杂度计算 3 这里的时间复杂度 O N log
  • HTML5语音合成功能

    这篇文章主要介绍了HTML5语音合成功能的实现代码 本文通过实例代码给大家介绍的非常详细 具有一定的参考借鉴价值 需要的朋友参考下吧 可将该代码复制到chrome控制台中体验 let msg new SpeechSynthesisUtter
  • this和super

    this this总是置于当前对象的成员类作区分 this是当前对象的引用 就是说当前用构造函数建的对象是谁 这个this就代表谁 它是一个引用 this 总是指向自己本事 super 子类在重写了父类的方法后 常常还需要使用到父类中被重写
  • do while循环语句的学习以及练习

    今天学的是do while循环语句 先执行循环体 直到条件的表达式为false 与while循环语句的区别 while语句先判断条件 满足时执行循环体 do while语句先执行循环体 满足条件在执行 语法 do 循环体 while 条件
  • kinova-jaco2使用Moveit!控制真实机械臂抓取固定点物体

    kinova jaco2使用Moveit 控制真实机械臂抓取固定点物体 一 机械臂坐标系 坐标系方向 位姿方向 轴的起始点 二 启动机械臂和Moveit 三 实现抓取 python代码 python文件建议直接用python启动 四 遇到的
  • react hook之useMemo

    useMemo的作用 Pass a create function and an array of dependencies useMemo will only recompute the memoized value when one o
  • LogisticRegression(逻辑回归)

    LogisticRegression定义 logistic回归 是一种广义的线性回归分析模型 常用于数据挖掘 疾病自动诊断 经济预测等领域 例如 探讨引发疾病的危险因素 并根据危险因素预测疾病发生的概率等 以胃癌病情分析为例 选择两组人群
  • SVG转为Png

    1 pom中引入maven依赖
  • 自定义实现OAuth2.0 授权码模式

    文章目录 OAuth2 0 授权码模式 实践 依赖知识 术语 授权码流程 认证服务器 拉起请求用户授权页面 用户手动授权 提交授权 生成code 下发Token 第三方应用 收到code并请求Token 访问受保护的资源 项目结构 Tomc
  • 类EMD的“信号分解方法”及MATLAB实现(第四篇)——VMD

    重头戏来了 在以往的应用经验里 VMD方法在众多模态分解方法中可以说是非常好的 从催更力度上看 这个方法也是格外受关注 笔者决定加快进度快一些写完这个方法 十月份了有些同学要开始做毕设 希望这篇文能帮上忙 1 VMD 变分模态分解 的概念
  • poj1338【丑数·DP】

    我记得这道题以前写过 而且是写出来了 DP吧 然后现在想了好久 没想出来 然后考虑一下递推 mdzz 直接就是让之前的这个每次乘以2 3 5就好了嘛 然后每轮取最小 include
  • jquery form表单.serialize()序列化后中文乱码问题原因及解决decodeURIComponent

    jquery form表单 serialize 序列化后中文乱码问题原因及解决 原因 serialize 自动调用了encodeURIComponent方法将数据编码了 解决方法 调用decodeURIComponent XXX true
  • 列表list转树形结构(python/golang/js/php)

    文章目录 1 原数据 2 利用对象内存共享生成嵌套结构 2 1 算法原理 2 2 算法实现 2 2 1 JS 2 2 2 Python 2 2 3 go 2 2 4 php 2 3 运行结果 3 递归 3 1 算法实现 3 1 1 pyth
  • 基于协同过滤算法的书籍推荐 毕业设计-附源码101555

    摘 要 21世纪的今天 随着社会的不断发展与进步 人们对于信息科学化的认识 已由低层次向高层次发展 由原来的感性认识向理性认识提高 管理工作的重要性已逐渐被人们所认识 科学化的管理 使信息存储达到准确 快速 完善 并能提高工作管理效率 促进
  • 微服务restful风格,用Post在服务之间发送请求接收不到参数接收不到问题(@RequestParam和@RequestBody)

    上代码 发送端 接收端 问题 发送端可以接受从前段传过来的数据 但是请求接收端时 接收端可以接收url请求 但是参数传不到接收端 分析 用get和post传输的数据是截然不同的 用get是追加在url之后 直接放在请求头 但是post请求的
  • 体验css:repeat和grid

    文章目录 一 repeat 1 语法 2 auto fill和auto fit 3 专属尺寸 fr auto max content min content 二 grid 1 设置grid布局 2 设置列宽行高 3 设置间距 4 设置分区
  • 【C++实现】 数据库连接池

    文章目录 涉及知识 为什么要弄连接池 功能介绍 成员变量讲解 代码剖析 Connection h Connection cpp ConnectionPool h ConnectionPool cpp 性能测试 难点 总结 涉及知识 MySQ
  • 解一元二次方程——Java

    解一元二次方程 可以使用下面的公式求元二次方程ax x bx c 0的两个根 b b 4ac称作一元二次方程的判别式 如果它是正值 那么一元二次方程就有两个实数根 如果它为0 方程式就只有一个根 如果它是负值 方程式无实数根 编写程序 提示
  • js中使用websocket

    后端地址是http的 websocket地址 ws开头 后端地址是https的 websocket地址wss开头 对于websocket没有跨域的问题 import MessageBox from element ui let url ws
  • Linux学习笔记--8(文件权限)

    文件权限与归属 Linux不同的字符来区分文件类型 常见如下 普通文件 d 目录文件 l 链接文件 b 块设备文件 c 字符设备文件 p 管道文件 对应目录文件 可读 表示能够读取目录内的文件列表 可写 表示能够在目录内新增 删除 重命名文