linux系统里的特殊权限rws和rwt

升级与操作有风险,请谨慎操作,提前做好备份!!!本公众号的内容只在测试环境上验证,不对您的任何操作行为负责。

    最近有好多学员建议我写一篇关于Linux系统文件权限的科普文章,虽然这样的文章满天飞,但是我还是要给大家整理一篇。

一、Linux系统文件基本权限介绍

    Linux系统使用了基于用户、组和权限的访问控制机制,所以系统文件和目录的权限是非常重要的,它们决定了谁可以读取、写入或执行文件。

1、Linux使用三个字符来表示一个文件或目录的权限:

  • r(Read 读权限),对应数字为4

  • w(Write 写权限),对应数字为2

  • x(Execute 执行权限),对应数字为1

2、Linux文件和目录的权限分为三个组:

  • 拥有者(Owner):文件的创建者,u表示

  • 组(Group):与文件关联的用户组,g表示

  • 其他(Others):系统上的所有其他用户,o表示

3、具体样例说明如下图所示:

图片

  • rwx代表文件所有者(u表示)权限,这里是用户uos对该文件拥有读写执行权限

  • r-x代表所属组(g表示)的权限,这里所属组拥有对该文件读和执行的权限

  • r-x 代表其他用户(o表示)的权限

二、Linux系统文件的s权限

1、s权限(setuid)说明

setuid:该位是让普通用户可以以root用户的角色运行只有root账号才能运行的程序或命令。s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行。在设置s权限时文件属主、属组必须先设置相应的x权限,否则s权限并不能正真生效。

图片

2、此处‌说明一下s权限有大写S和小写s之分:

小写s(如 rwsr-xr-x)‌:表示文件设置了SetUID权限,并且文件本身有执行权限(x)。这种情况下,当用户执行该文件时,会以文件所有者的身份运行,实现临时权限提升。例如,/usr/bin/passwd 命令通常显示 -rwsr-xr-x,允许普通用户修改密码时以root权限操作/etc/shadow文件。

‌大写S(如 rwSr-xr-x)‌:表示文件设置了SetUID权限,但文件本身没有执行权限(x)。这种情况下,SetUID位无效,因为文件无法被执行,权限提升机制不会生效。大写S通常出现在手动设置SetUID,但忽略文件执行权限。

图片

3、设置setuid权限的方法:

方法1:

第1步:chmod 755 /usr/bin/passwd第2步:chmod u+s /usr/bin/passwd

图片

方法2:

chmod 4755 /usr/bin/passwd

图片

4、取消setuid权限的方法:

方法1:

 chmod u-s   /usr/bin/passwd

图片

方法2:

 chmod 755   /usr/bin/passwd

图片

三、Linux系统文件的t权限

1、t权限(粘滞位)说明

  • 设置粘滞位,一个文件可读写的用户并一定想让他有删除此文件的权限,如果文件设置了t权限则只用属主和root有删除文件的权限,通过chmod +t filename 来设置t权限。

  • 同样的,当没有x权限的时候,为大写T

  • 设置粘滞位的文件,只能由以下账户删除:超级管理员、该目录的所有者、该文件的所有者

2、设置t权限的方法:

方法1:

chmod 1755 1.txt  ##可以是目录,也可以是文件

图片

方法2:​​​​​​​

第1步:chmod 755 2.txt第2步:chmod +t  2.txt

图片

3、取消t权限的方法:

方法1:

 chmod 755   2.txt

方法2:

 chmod -t   1.txt

图片

四、Linux系统文件其他特殊权限

1、i权限(不可修改权限)

i:不可修改权限,例:chattr +i 2.txt 则2.txt文件就不可修改,无论任何人,如果需要修改需要先删除i权限,用chattr -i 2.txt就可以了。查看文件是否设置了i权限用lsattr 2.txt

图片

图片

2、a权限(追加权限)

a:只追加权限,对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。可以使用chattr +a设置追加权限

图片

<think> 我们正在讨论的是 Java 中 RandomAccessFile 的访问模式,具体是 rws rwd 的区别。 根据引用内容: 引用[1]:rwd模式可用于减少执行的I/O操作数量。使用rwd只需要将文件内容的更新写入存储器,使用rws需要同时更新文件的内容要写入的元数据,这通常需要至少再进行一次底层I/O操作。[^1] 引用[2]:rwd:与rws模式类似。区别在于rwd只更新文件内容,不更新文件的元数据,而rws模式会同时更新文件内容及元数据。所谓元数据保存了文件的基本信息,包括文件类型(是文件还是目录)、文件的创建时间、文件的修改时间、文件的访问权限(是否可读、是否可写、是否可执行)等等。[^2] 引用[3]:对于"rws",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。"rwd"则要求对文件内容的每个更新都同步写入到底层存储设备。[^3] 引用[4]:rws:要求对文件的内容或元数据的每个更新都同步写入到底层的存储设备。rwd:要求对文件的内容的每个更新都同步写入到底层的存储设备。[^4] 总结: rws rwd 都是 RandomAccessFile 的读写模式,它们与 rw 模式的不同之处在于,它们要求对文件的更新(写入)必须同步写入到底层存储设备(即立即写入磁盘,而不仅仅是系统缓冲区)。这两种模式的区别在于: - **rws**:同步写入文件内容以及文件的元数据(metadata)。 - **rwd**:仅同步写入文件内容,不同步写入元数据。 元数据包括文件的大小、修改时间等(如引用[2]所述)。 因此,rws 模式比 rwd 模式更严格,因为它要求每次写入操作都要更新文件内容元数据,这可能会导致更多的I/O操作(因为元数据的更新可能涉及额外的磁盘写入操作)。而 rwd 模式则只保证文件内容的更新被同步写入,元数据的更新可能不会立即同步(但会在文件关闭时或系统刷新时写入)。 应用场景: - 如果需要确保文件内容以及文件属性(如最后修改时间)都立即写入磁盘,使用 rws。 - 如果只关心文件内容(例如,在写入关键数据时,希望确保数据不因系统崩溃而丢失),而不关心文件属性(如最后修改时间)是否立即更新,使用 rwd 模式可以减少I/O操作次数,提高性能。 注意:这两种模式都会比普通的 rw 模式慢,因为它们涉及到磁盘同步操作。 示例代码: ```java // 使用 rwd 模式 RandomAccessFile raf1 = new RandomAccessFile("file.txt", "rwd"); // 使用 rws 模式 RandomAccessFile raf2 = new RandomAccessFile("file.txt", "rws"); ``` 引用出处: 引用[1]引用[2]明确指出了rwsrwd在更新内容上的区别:rws更新内容元数据,rwd只更新内容。 引用[3]引用[4]则从同步写入的角度说明了两者的要求。 因此,回答如下: </think> ### 计算机读写权限rws 与 rwd 的区别 在 Java 的 `RandomAccessFile` 文件操作中,**rws** **rwd** 都是同步写入模式,核心区别在于数据同步的范围: | **模式** | **同步写入内容** | **元数据更新** | I/O 操作次数 | 典型应用场景 | |----------|-------------------------------------------|----------------|--------------------|---------------------------| | **rws** | 文件内容 + 元数据(文件大小、修改时间等) | 立即同步 | 较高(至少 2 次) | 需确保文件完整状态一致 | | **rwd** | 仅文件内容 | 延迟同步 | 较低 | 仅需确保数据内容不丢失 | #### 关键差异详解: 1. **元数据同步** - **rws**:强制将文件内容**元数据**(文件类型、创建时间、修改时间、访问权限等)同步写入底层存储设备[^2][^3] - **rwd**:仅同步文件内容,元数据更新延迟到系统刷新时写入[^1][^4] `示例:修改文件后,rws 会立即更新文件大小修改时间,rwd 则不会` 2. **I/O 操作效率** - rws 每次写入需至少 2 次 I/O(内容 + 元数据) `如:$$ \text{I/O}_{rws} = \text{I/O}_{内容} + \text{I/O}_{元数据}$$` - rwd 仅需 1 次 I/O(内容)[^1] `如:$$ \text{I/O}_{rwd} = \text{I/O}_{内容}$$` 3. **数据安全性对比** - **系统崩溃场景**: - rws:确保内容与元数据一致(如文件大小与实际内容匹配) - rwd:可能因元数据未更新导致文件状态异常[^3] - **电源故障场景**: - 两者均保证已写入内容不丢失 - rws 额外保证文件属性正确性 #### 使用示例: ```java // rwd 模式:关键数据写入(如日志) RandomAccessFile logFile = new RandomAccessFile("app.log", "rwd"); logFile.write("ERROR: System failure".getBytes()); // rws 模式:数据库文件操作 RandomAccessFile dbFile = new RandomAccessFile("data.db", "rws"); dbFile.write(newData); ``` > **选择建议**:优先使用 rwd(性能更高),仅在需要严格保证元数据一致性(如数据库文件)时选用 rws[^1][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值