Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组。
查看目录权限:
ls -l -d dir
- u:代表文件或目录的所有者(user)。
- g:代表与文件或目录属于同一组的用户(group)。
- o:代表其他用户(others),即既不是所有者也不属于同一组的用户
- r:read:读取权限, 列出目录内容,对应数字 4。
- w:write:写入权限, 在目录中创建、删除文件,对应数字 2。
- x:execute:执行权限,可访问目录内容,对应数字 1。
- -:没有权限, 用数字表示为0
设置权限:
chown: 改变文件或目录的所属主以及所属组
chmod: 为文件或目录设置访问权限
chmod 修改文件ugo权限
chmod:change mode
底层实现
chmod命令在底层是通过修改文件系统中存储的文件权限位来实现的。这些文件权限位根据文件系统(如ext,hfs等)的不同而有所不同,但传递给操作系统时,它们都会被解释为标准的Unix样式权限。
当你运行例如 chmod 755 文件名 这样的命令时,发生了以下步骤:
- shell解析命令行参数并调用chmod系统调用。
- 系统调用接收到请求后,首先检查当前用户是否有足够的权限来更改该文件或目录的权限。只有文件的所有者或root用户才可以更改其权限。
- 如果用户有足够的权限,系统将新的权限设置应用于指定的文件或目录,并将新权限写入到文件系统中。
- 系统返回给shell表示操作成功完成。
需要注意的是,虽然大多数现代Unix-like操作系统(包括Linux)都提供了类似于chmod的命令和对应的系统调用,但它们在底层如何实现可能会因操作系统和文件系统类型不同而略有差异。
语法:
#语法1:
chmod 选项 xyz 文件或目录
# xyz : 数字类型的权限属性,为 rwx 属性数值的相加。
#语法2:
chmod 对象(u/g/o/a) 操作符(=/-/+) 权限类型(r/w/x) 文件/目录
选项:
-h :如果操作的对象是符号链接,那么修改符号链接本身的权限,而不是它所指向的文件或目录的权限
-c, --changes :只显示被修改过权限的文件的信息,不显示没有变化的文件
-f, --silent, --quiet : 忽略错误信息,不显示任何警告或错误
-v, --verbose:显示每个被修改的文件的信息,包括修改前后的权限
--no-preserve-root:不对‘/’特别处理 (默认)。
--preserve-root :不对‘/’进行递归操作。
--reference=参考文件 :使用这个参考文件模式而不用指定模式值(如:a+r)。
-R, --recursive :对目录及内容递归地更改文件模式。在递归操作中忽略符号链接.
--help : 显示帮助信息并退出。
--version : 输出版本信息并退出。
操作符:
+ :添加权限,即给指定的对象增加某些权限
- :删除权限,即给指定的对象减少某些权限
= :设置权限,即给指定的对象设置为某些权限,覆盖原有的权限
权限:
- 读取权限:表示用户能否查看文件的内容或列出目录的内容。
- 写入权限:表示用户能否修改文件的内容或在目录中创建和删除文件。
- 执行权限:表示用户能否运行文件或进入目录。
示例:
#r=4 、 w=2、 x=1、 -=0
ls -al /A #文件A权限: drwxr-xr-x
chmod 777 /A #文件A权限: drwxrwrxwrx
chmod 744 /A #文件A权限: drwxrw--w--
chmod 740 /A #文件A权限: drwxrw-----
xyz计算方式:
777 = [4+2+1][4+2+1][4+2+1]
744 = [4+2+1][4+0+0][4+0+0]
740 = [4+2+1][4+0+0][0+0+0]
符号类型改变文件权限
+、-、=;a=ugo
#设置所有用户可读取 t.sh 文件
chmod ugo+r t.sh
#或 a=guo
chmod a+r t.sh
#拥有者的权限:读、写、执行
chmod u+rwx t.sh
#设置当前目录下的所有档案与子目录皆设为任何人可读写
chmod -R a+rw *
#文件t.sh,其他用户,没有读写执行权限
chmod o-rwx t.sh
使用逗号',' 分隔多个符号,以一次修改多个对象的多个权限:
chmod u+rwx,g-rx,o=r t.sh
给文件和目录添加执行权限:
#运行一个文件或进入一个目录,需要给它们添加执行权限:
chmod +x file1
chmod +x dir1
特殊模式
字母
t :粘滞位,用于目录,表示只有目录的所有者或文件的所有者才能删除或重命名目录中的文件
s :设置用户ID位或设置组ID位,用于文件或目录,表示执行文件时以文件所有者的身份运行,或者创建目录中的文件时以目录所有者的组作为文件的组
语法:chmod [操作符]参考文件或目录]
#给目录dir1添加粘滞位,使得只有目录的所有者或文件的所有者才能删除或重命名目录中的文件。
chmod +t dir1
根据参考文件更改另一个文件的模式:
语法:chmod --reference=参考文件 文件名
#把file2的权限,改为和file1一样
chmod --reference=file1 file2
rwx权限示例:
文件 | 目录 | |
r | 读取文件内容:cat、head、tail | 列出目录内部的内容:ls |
w | 更改文件内容:vim、echo | 创建、删除目录中的文件:rm、touch、mkdir |
x | 作为命令执行:bash | 访问目录的内容:cd |
注意:
文件: x 权限小心给予
目录: w 权限小心给予
对文件:如果要执行该文件,不仅需要该文件的 x权限,而且同时需要该文件的 r权限,否则执行权限不生效(先读才可以执行)【文件改名与本身权限无关,与上级目录w权限有关】
1.#用户alan只有 r 权限,无法更改和执行
-rw-r--r--. 1 root root 10 6月 18 17:16 a
2.用户 alan 尝试删除 a 文件
#alan用户无法删除 a文件,a文件的上一级目录没有对 alan 的w权限
[alan@localhost tmp]$ rm -rf a
3.用户 alan 尝试更改 a 文件内容
#alan用户无法修改 a文件,没有 w权限
[alan@localhost tmp]$ vim a
4.用户 alan 尝试执行 a 文件内容
#无法执行 a文件,无 x 权限
[alan@localhost tmp]$ bash /tmp/a
5.修改 a 文件的权限
chmod o-rwx a
#取消a文件的其他用户权限
-rw-r-----. 1 root root 10 6月 18 17:17 a
6.a文件对其它用户权限为0
#无法查看a文件
[alan@localhost tmp]$ cat a
#无法执行a文件
[alan@localhost tmp]$ bash a
对目录:如果要在该目录内创建文件或者删除文件,则需要该目录的 W权限,而且同时需要该目录的 x权限,否则W权限不生效
1.目录A,对其它用户的权限为 r
#目录A 其他用户只有r权限
drwxr-xr--. 2 root root 6 6月 18 17:35 A
2.用户 alan 尝试创建、删除 A 目录内的文件
#无法创建、删除A目录中的文件,alan没有 w 、x 权限
[alan@localhost tmp]$ touch ./A/a
3.用户 alan 尝试进入到A目录内
#无法切换到A目录,没有 x 权限
[alan@localhost tmp]$ cd ./A
chmod命令的注意事项
在使用Linux shell中的chmod命令时,有几个重要注意事项:
- 权限设置的谨慎性:应该谨慎地设置文件和目录的权限。给予过多的权限可能会导致安全风险,例如,如果你错误地给了所有用户对一个关键文件的写入权,那么任何人都可以修改这个文件。相反,如果你没有给足够的权限,可能会阻止正常用户进行必要的操作。
- 递归选项的使用:当使用-R或–recursive选项时,请确保你知道正在做什么。这将修改指定目录及其所有子目录和文件的权限。如果不小心使用,可能会导致不可预见的结果。
- 根目录操作:默认情况下,chmod允许对根目录"/"进行操作。但是,这通常是非常危险且不建议的行为。因此,在执行涉及根目录及其子目录/文件的递归操作时,请务必小心,并考虑使用–preserve-root选项。
- 符号链接:需要注意,默认情况下chmod命令不会更改符号链接指向的实际文件或目录的权限。它只更改符号链接本身(实际上并无效果)。如果想通过符号链接更改实际文件或目录的权限,则需要直接对那些实际文件或目录执行chmod命令。
- 特殊权限:除了基本读、写、执行权限外,还有一些特殊权限如setuid、setgid和sticky bit等也可以用chmod来设置。在处理这些特殊权限时需要格外小心。
- 参考模式:当使用–reference=参考文件参数时,请确保参考文件具有正确且合适的访问级别。否则可能导致新文件具有错误或者不安全的访问级别。
chown 修改文件属主/属组
chown:change owner:更改文件的属主(所有者)、属组 (所属组)
语法:
chown 选项 所有者 文件或目录
#
chown 选项 所有者:属组名 文件或目录
# : 或 . 都可以
选项
-c, --changes :类似于详细模式,但只有在进行更改时才生成输出
-f, --silent, --quiet :抑制大多数错误消息
-v, --verbose :操作成功后生成输出
–dereference :影响每个符号链接而不是符号链接本身
-h, --no-dereference ;影响符号链接而不是符号链接引用的文件
–from=CURRENT_OWNER:CURRENT_GROUP :只有当前所有者和/或组匹配CURRENT_OWNER和/或CURRENT_GROUP时才更改所有者和/或组
–no-preserve-root :不对’/'特殊处理(默认)
–preserve-root :不对’/'进行递归操作
–reference=RFILE :使用RFILE的所有者和组,而不是指定OWNER:GROUP值
-R, --recursive :对目录及其内容进行递归操作
示例:
1.对文件的 属主 或 属组 进行修改
#对文件:
#将文件 file.txt 的拥有者 改为 alan
chown alan file.txt
#将文件 file.txt 的所属组 改为 group1
chown :group1 file.txt
2.同时修改文件的 属主、属组
#将文件 file.txt 的拥有者 改为 tom , 且所属组改为 group2
chown tom:group2 file.txt
3.修改目录的 属主 属组
#对目录:dir目录
chown -R alan dir
chown -R :group1 dir
chown -R tom:group2 dir
4.递归修改目录下的属主、属组,并显示过程
chown -Rv alan:group1 dir
5.将 dir 的 属主属组 改回和d1 一样
chown --reference=d1 dir
6.修改A目录及以下的所有文件的属组:
chown -R alan:g1 /home/A
# /home/A
# /home/A/B /home/A/T-17.
# /home/A/B/T-1
7.修改A目录下的所有文件属组,但不改变A本身
#只改A目录下一级的文件
chown .g1 /home/A/*
#只修改A目录下的所有文件属组,但不改变A本身
chown -R .g2 /home/A/*
#修改A目录下的所有文件属组,包括A本身
chown -R .g2 /home/A/
chgrp 修改文件所属组
change group
chgrp [-R] 属组名 文件或目录
# -R : 进行递归(recursive)的持续变更,以及连同次目录下的所有文件都会变更
示例:
chgrp root /A #将/A的所属组改为root