### Linux与UNIX Shell编程指南知识点总结
#### 一、文件权限与限制
1. **文件的基本权限**:
- **读取(r)**:允许查看文件内容。
- **写入(w)**:允许修改或删除文件。
- **执行(x)**:如果文件是一个Shell脚本或程序,则允许执行。
2. **权限分类**:
- **文件所有者(Owner)**:创建文件的用户。
- **文件所属组(Group)**:与文件相关的用户组中的任何用户。
- **其他用户(Others)**:不属于文件所属组的任何用户。
3. **`ls -l` 命令解析**:
- 第1列的第一个字符表示文件类型:`d`为目录,`l`为符号链接,`b`为块设备文件,`c`为字符设备文件,`p`为命名管道文件,`s`为套接字文件,`-`为普通文件。
- 第1列的第2-10个字符分为三个三元组(triplet),分别表示文件所有者、所属组和其他用户的权限。
- 第2列表示文件的硬链接数量。
- 第3列表示文件的所有者用户名。
- 第4列表示文件所有者所在的用户组名称。
- 第5列表示文件大小(以字节为单位)。
- 第6列表示文件最后修改时间。
- 第7列表示文件名。
4. **文件类型**:
- **目录(Directory)**:存储其他文件和目录。
- **符号链接(Symbolic Link)**:指向另一个文件的引用。
- **块设备文件(Block Device File)**:通常用于硬盘驱动器等硬件设备。
- **字符设备文件(Character Device File)**:用于处理流数据,如串行端口。
- **命名管道文件(Named Pipe File)**:进程间通信的一种方法。
- **套接字文件(Socket File)**:用于网络通信。
- **普通文件**:不含上述特定类型的文件。
5. **文件权限位**:
- 每个文件的权限位由9个字符组成,分为三个三元组(triplet),分别对应文件所有者(owner)、所属组(group)和其他用户(other)的权限。
- 一个三元组由三个字符位组成(rwx),分别表示可读、可写、可执行。如果该位置的字符是“-”,则表示不具备该权限。
- SUID(Set User ID):当文件的权限位中的所有者三元组的第三个位置设置为“s”时,运行该文件时将使用文件所有者的用户ID代替运行文件的用户的用户ID。
- SGID(Set Group ID):当文件的权限位中的所属组三元组的第三个位置设置为“s”时,运行该文件时将使用文件所属组的组ID代替运行文件的用户的组ID。
- 粘性位(Sticky Bit):在某些目录(如/tmp)的其他用户三元组的第三个位置设置为“t”。这可以防止非目录所有者删除目录下的文件。
6. **使用`chmod`命令更改权限位**:
- **符号模式**:`chmod [who][operator][permission] file_name`
- `who`:可以是`u`(文件所有者)、`g`(所属组)、`o`(其他用户)或`a`(全部)。默认为`a`。
- `operator`:可以是`+`(添加权限)、`-`(移除权限)或`=`(设置权限)。
- `permission`:可以是`r`、`w`、`x`、`s`(SUID和SGID)、`t`(粘性位)或`l`(锁定权限,防止其他用户更改权限)。
- 示例:`chmod u+x, o-w myfile` // 给文件所有者添加执行权限,移除其他用户的写权限。
- **数字模式**:`chmod mode file_name`
- `mode`:四位八进制数字,第一位用于SUID和SGID、第二位用于文件所有者权限、第三位用于所属组权限、第四位用于其他用户权限。如果输入的模式少于4位,系统会在前面填充0。
- 示例:`chmod 754 myfile` // 设置文件权限为所有者可读写执行、所属组可读执行、其他用户只可读。
- 特殊权限位:SUID(4755)、SGID(6755)和粘性位(7755)。
通过以上内容的学习,我们可以更好地理解Linux和UNIX系统中文件的权限设置,这对于日常管理和编程都非常重要。掌握了这些基本概念后,我们就能更加灵活地使用Linux系统,并确保系统的安全性。