Shell实战之chmod权限讲解

目录

  1. 引言
  2. chmod命令基础
  3. 权限的数字表示法
  4. 权限的符号表示法
  5. 特殊权限位
  6. 递归修改权限
  7. 实战示例
  8. 常见问题与解答
  9. 最佳实践与安全考虑
  10. 总结

引言

在Unix和Linux系统中,文件权限管理是系统安全和用户访问控制的核心。chmod(change mode)命令是Shell脚本中最常用且最重要的权限管理工具之一。本文将深入探讨chmod命令的使用,从基础概念到高级技巧,通过大量实战示例,帮助您全面掌握文件权限管理。

chmod命令基础

chmod命令用于更改文件或目录的访问权限。在Linux系统中,每个文件都有三种基本权限:

  • 读取®: 允许查看文件内容或列出目录内容
  • 写入(w): 允许修改文件内容或在目录中创建、删除文件
  • 执行(x): 允许执行文件或访问目录

这些权限分别应用于三类用户:

  • 所有者(u): 文件的创建者
  • 所属组(g): 与文件关联的用户组
  • 其他用户(o): 既不是所有者也不在所属组的用户

示例1: 查看文件权限

ls -l example.txt

输出如下:

-rw-r--r-- 1 user group 1234 Oct 15 14:30 example.txt

这里,-rw-r--r--表示权限字符串,其中:

  • 第一个字符-表示这是一个普通文件(如果是目录,则为d)
  • 接下来的三个字符rw-表示所有者的权限(可读可写不可执行)
  • 再接下来的三个字符r--表示所属组的权限(只读)
  • 最后三个字符r--表示其他用户的权限(只读)

权限的数字表示法

chmod命令支持使用数字来表示权限。每种权限对应一个数字:

  • 读® = 4
  • 写(w) = 2
  • 执行(x) = 1

通过将这些数字相加,我们可以得到一个三位数,分别代表所有者、所属组和其他用户的权限。

示例2: 使用数字修改权限

chmod 755 script.sh

这个命令将script.sh的权限设置为:

  • 所有者: 7 (4+2+1) = 读+写+执行
  • 所属组: 5 (4+1) = 读+执行
  • 其他用户: 5 (4+1) = 读+执行

权限的符号表示法

除了数字表示法,chmod还支持使用符号来修改权限。基本语法是:

chmod [who][operation][permission] file

其中:

  • who: u(所有者), g(所属组), o(其他用户), a(所有用户,相当于ugo)
  • operation: +(添加权限), -(移除权限), =(设置精确权限)
  • permission: r(读), w(写), x(执行)

示例3: 使用符号修改权限

chmod u+x,go-w script.sh

这个命令给所有者添加执行权限,同时移除所属组和其他用户的写权限。

特殊权限位

除了基本的读、写、执行权限,Linux还提供了三种特殊权限:

  1. SetUID (SUID): 4000
  2. SetGID (SGID): 2000
  3. Sticky Bit: 1000

示例4: 设置SUID权限

chmod u+s executable

这将设置SUID位,使得执行该文件的用户临时获得文件所有者的权限。

示例5: 设置SGID权限

chmod g+s shared_directory

对目录设置SGID位,使得在该目录下创建的新文件自动继承目录的所属组。

示例6: 设置Sticky Bit

chmod +t public_directory

设置Sticky Bit,防止用户删除不属于自己的文件,通常用于共享目录。

递归修改权限

有时我们需要修改整个目录树的权限,这时可以使用-R选项进行递归操作。

示例7: 递归修改权限

chmod -R 755 project_directory

这个命令会递归地将project_directory及其所有子目录和文件的权限设置为755。

实战示例

接下来,我们将通过一系列实战示例,深入探讨chmod命令的各种用法和技巧。

示例8: 创建一个安全的共享目录

假设我们要创建一个名为shared的目录,允许所有用户读取和执行,但只有所有者可以修改内容。

mkdir shared
chmod 755 shared

解释:

  • 755权限意味着所有者有完全控制权(rwx),而其他人只能读取和执行(r-x)。

示例9: 设置文件的默认权限

使用umask命令可以设置新创建文件的默认权限。

umask 022
touch newfile
ls -l newfile

输出:

-rw-r--r-- 1 user group 0 Oct 15 15:00 newfile

解释:

  • umask 022设置默认权限为644(666 - 022)
  • 新创建的文件默认没有执行权限

示例10: 修改多个文件的权限

假设我们有多个脚本文件需要添加执行权限:

chmod +x script1.sh script2.sh script3.sh

这个命令会同时给三个脚本文件添加执行权限。

示例11: 使用符号链接时的权限处理

创建一个符号链接并观察其权限:

echo "Hello" > original.txt
ln -s original.txt link.txt
ls -l link.txt

输出:

lrwxrwxrwx 1 user group 12 Oct 15 15:10 link.txt -> original.txt

注意:符号链接的权限总是显示为lrwxrwxrwx,但实际访问时会使用原始文件的权限。

示例12: 处理不同类型文件的权限

创建不同类型的文件并设置适当的权限:

touch regular_file
mkdir directory
mkfifo named_pipechmod 644 regular_file
chmod 755 directory
chmod 660 named_pipels -l regular_file directory named_pipe

输出:

-rw-r--r-- 1 user group 0 Oct 15 15:15 regular_file
drwxr-xr-x 2 user group 4096 Oct 15 15:15 directory
prw-rw---- 1 user group 0 Oct 15 15:15 named_pipe

解释:

  • 普通文件通常不需要执行权限
  • 目录需要执行权限才能访问其内容
  • 命名管道(FIFO)通常只需要读写权限

示例13: 使用特殊权限位

设置一个具有SUID权限的脚本:

echo '#!/bin/bash
whoami' > check_user.shchmod u+x check_user.sh
sudo chown root:root check_user.sh
sudo chmod u+s check_user.shls -l check_user.sh
./check_user.sh

输出:

-rwsr-xr-x 1 root root 20 Oct 15 15:20 check_user.sh
root

解释:

  • SUID权限使脚本以root身份运行
  • 注意:在实际环境中,给脚本设置SUID可能存在安全风险

示例14: 使用ACL (Access Control Lists)

在某些文件系统中,我们可以使用ACL来提供更细粒度的权限控制:

touch acl_file
setfacl -m u:alice:rw acl_file
getfacl acl_file

输出:

# file: acl_file
# owner: user
# group: group
user::rw-
user:alice:rw-
group::r--
mask::rw-
other::r--

这个例子展示了如何为特定用户(alice)设置额外的权限,而不影响其他用户。

示例15: 处理权限冲突

当用户同时属于多个组时,可能会遇到权限冲突:

sudo groupadd group1
sudo groupadd group2
sudo useradd -G group1,group2 testuserecho "Test content" > test_file
chmod 640 test_file
chown :group1 test_filesudo -u testuser cat test_file  # 成功
chmod 600 test_file
sudo -u testuser cat test_file  # 失败

解释:

  • 初始时testuser可以通过group1的权限读取文件
  • 改变权限后,即使testuser属于group1,也无法访问文件

常见问题与解答

  1. Q: 为什么我无法更改某些文件的权限?
    A: 您可能没有足够的权限。只有文件所有者或root用户可以更改文件权限。

  2. Q: 设置了执行权限后,为什么脚本仍然无法执行?
    A: 确保脚本有正确的shebang行(如#!/bin/bash),并且文件系统没有被挂载为noexec。

  3. Q: chmod命令是否会影响符号链接指向的原始文件?
    A: 不会。chmod作用于符号链接时,会改变链接指向的文件,而不是链接本身。

  4. Q: 如何恢复文件的默认权限?
    A: 使用chmod 644 file对于普通文件,chmod 755 directory对于目录通常是安全的默认值。

  5. Q: 为什么有时需要使用sudo来更改权限?
    A: 如果您不是文件的所有者,或者需要设置特殊权限(如SUID),就需要使用sudo获取root权限。

最佳实践与安全考虑

  1. 最小权限原则: 只给文件必要的权限,避免过度开放。

  2. 定期审查: 定期检查重要文件和目录的权限,确保它们没有被意外更改。

  3. 谨慎使用特殊权限: SUID、SGID和Sticky Bit应谨慎使用,尤其是在系统关键文件上。

  4. 脚本权限: 通常脚本文件不需要SUID/SGID权限,使用sudo更安全。

  5. 组权限管理: 善用组权限可以简化权限管理,特别是在多用户环境中。

  6. 文件系统选择: 考虑使用支持ACL的文件系统,以获得更细粒度的权限控制。

  7. 权限变更日志: 在关键系统上,考虑记录权限变更的日志,以便追踪潜在的安全问题。

  8. 自动化权限管理: 对于大型系统,考虑使用配置管理工具(如Ansible)来自动化权限设置。

总结

通过本文,我们深入探讨了chmod命令在Shell脚本中的应用,从基本概念到高级技巧,涵盖了数字表示法、符号表示法、特殊权限位等多个方面。通过丰富的实战示例,我们展示了如何在实际环境中灵活运用chmod来管理文件权限。

正确理解和使用文件权限是系统管理和安全的基础。掌握chmod命令不仅能帮助您更好地管理文件系统,还能提高系统的整体安全性。在实际应用中,请始终遵循最小权限原则,定期审查权限设置,并注意特殊权限的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Helsinki-NLP 中英文翻译本地部署 - python 实现

通过 Helsinki-NLP 本地部署中英文翻译功能。该开源模型性价比相对高,资源占用少,对于翻译要求不高的应用场景可以使用,比如单词,简单句式的中英文翻译。 该示例使用的模型下载地址:【免费】Helsinki-NLP中英文翻译本…

心觉:激活潜意识财富密码:每天一练,财富自动来

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作200/1000天 为什么有些人总是轻而易举地吸引到财富 而你却努力多年仍然徘徊在财务的困境中? 你每天都在辛苦工作&…

MambaVision原理和源码调测

Hatamizadeh, Ali and Jan Kautz. “MambaVision: A Hybrid Mamba-Transformer Vision Backbone.” ArXiv abs/2407.08083 (2024): n. pag. 1.模型原理 关键思路: 通过重新设计Mamba的架构和在最终层增加自注意力块,提高了Mamba模型对视觉特征的建模能力…

C语言练习

题目: 1.运用switch选择语句,编写一段C语言,请根据输入的数字,显示相应的星期日,如果数字所对应的星期日并不存在请显示“抱歉,您输入的内容并不存在。” 分析:1.在本题中,要运用到…

C语言之扫雷小游戏(完整代码版)

说起扫雷游戏,这应该是很多人童年的回忆吧,中小学电脑课最常玩的必有扫雷游戏,那么大家知道它是如何开发出来的吗,扫雷游戏背后的原理是什么呢?今天就让我们一探究竟! 扫雷游戏介绍 如下图,简…

【网络安全】漏洞案例:提升 Self-XSS 危害

未经许可,不得转载。 文章目录 Self-XSS-1Self-XSS-2Self-XSS-1 目标应用程序为某在线商店,在其注册页面的First Name字段中注入XSS Payload: 注册成功,但当我尝试登录我的帐户时,我得到了403 Forbidden,即无法登录我的帐户。 我很好奇为什么我无法登录我的帐户,所以我…

如何破解 AI 聊天机器人让它们吐露秘密!窥探 AI 系统指令的 10 种技巧

​ 有时,为了确保 AI 的安全性和透明性,用户需要自己动手,揭开系统指令的面纱。 如果人工智能现在已经成为生活中的事实,并影响着我们的福祉,人们理应知道它的运作原理。 对一些人来说,科幻电影中的经典…

新装ubuntu22.04必做两件事,不然可能没法用

一、换服务源 在全部里面找到软件和安装;打开后 在更多里面匹配一下最适合自己的软件源;这个过程比较漫长;要耐心等待 二、换软件安装中心 先执行: sudo apt upgrade 后执行: sudo apt install plasma-discover…

初级网络工程师之从入门到入狱(四)

本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、Wlan应用实战1.1、拓扑图详解1.2、LSW11.3、AC11.4、抓包1.5、Tunnel隧道模式解析1.6、AP、…

【AIF-C01认证】亚马逊云科技生成式 AI 认证正式上线啦

文章目录 一、AIF-C01简介二、考试概览三、考试知识点3.1 AI 和 ML 基础知识3.2 生成式人工智能基础3.3 基础模型的应用3.4 负责任 AI 准则3.5 AI 解决方案的安全性、合规性和监管 四、备考课程4.1 「备考训练营」 在线直播课4.2 「SkillBuilder」学习课程 五、常见问题六、参考…

Flutter技术学习

以下内容更适用于 不拘泥于教程学习,而是从简单项目入手的初学者。 在开始第一个项目之前,我们先要了解 两个概念。 Widget 和 属性 Widget 是用户界面的基本构建块,可以是任何 UI 元素。属性 是 widget 类中定义的变量,用于配…

【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

【IEEE独立出版 | 厦门大学主办】 第四届人工智能、机器人和通信国际会议(ICAIRC 2024) 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 >>往届均已成功见刊检索…

深入理解Transformer的笔记记录(精简版本)NNLM → Word2Vec

文章的整体介绍顺序为: NNLM → Word2Vec → Seq2Seq → Seq2Seq with Attention → Transformer → Elmo → GPT → BERT 自然语言处理相关任务中要将自然语言交给机器学习中的算法来处理,通常需要将语言数学化,因为计算机机器只认数学符号…

Node.js管理工具NVM

nvm(Node Version Manager)是一个用于管理多个 Node.js 版本的工具。以下是 nvm 的使用方法和一些常见命令: 一、安装 nvm 下载 nvm: 地址:https://github.com/coreybutler/nvm-windows/releases访问 nvm 的 GitHub 仓…

稳字诀! 洞见 强者的社交格局:从不恋战——早读(逆天打工人爬取热门微信文章解读)

都是文字 引言Python 代码第一篇 洞见 强者的社交格局:从不恋战第二篇 稳字诀结尾 引言 今天很奇怪 一直都挺烦造的 好像有很多事情忙 但是就是忙着找不定 不能定下心来 主要还是在股市 其他方面应该没啥 计划表还是不够给力 没办法把心在约定住 稳字诀 勤燃香,奋…

GPT和BERT

GPT和BERT都是基于Trm的应用,可以理解为GPT是decoder的应用,BERT可以说是encoder的应用 GPT 如图,就是GPT的原理,GPT是做生成式的任务的,没有办法进行下游任务改造,训练也是针对生成式的任务进行训练 BE…

云开发 | 微信小程序云开发无法获取数据库数据

1.我在我的云数据库中创建了一个数据表(即collection数据集)userList,并且存入了两条用户信息数据 2. 想要通过按钮触发事件拿取数据库中数据并且打印在控制台时,获取数据失败,控制台无输出 3. 初始化 | 在开始使用数据库 API 进…

“医者仁术”再进化,AI让乳腺癌筛查迎难而上

世卫组织最新数据显示,我国肿瘤疾病仍然呈上升趋势,肿瘤防控形势依然比较严峻。尤其是像乳腺癌等发病率较高的疾病,早诊断和早治疗意义重大,能够有效降低病死率。 另一方面,中国地域广阔且发展不平衡,各地…

Qt-界面优化盒子模型(71)

目录 描述 相关属性 使用 描述 盒子模型 例如下面房子模型 • Content 矩形区域: 存放控件内容.⽐如包含的⽂本/图标等. • Border 矩形区域: 控件的边框. • Padding 矩形区域: 内边距. 边框和内容之间的距离. • Margin 矩形区域: 外边距. 边框到控件 geometry 返回的矩形…

Qt5.14.2 安装详细教程(图文版)

Qt 是一个跨平台的 C 应用程序开发框架,主要用于开发图形用户界面(GUI)程序,但也支持非 GUI 程序的开发。Qt 提供了丰富的功能库和工具,使开发者能够在不同平台上编写、编译和运行应用程序,而无需修改代码。…