Linux文件权限管理看这篇就够了
Synopsis: 如果你设置好文件权限后,却经常遇到Permission denied,说明你的权限设置有问题,判断是否有文件相应的操作权限,首先要判断是否拥有此文件的上层目录的相应操作权限。本文详细介绍了为什么rx权限对目录文件很重要,创建普通文件和目录文件时的预设权限是什么,有时候你用root账号也无法删除一个文件,可能是此文件设置了隐藏权限,如果有团队项目文件共享的需求你可能要用到SUID/SGID/SBIT,配置Samba或FTP服务器时还会经常使用访问权限控制ACL,所有这些文件权限管理你都可以轻松掌握,只需要静下心来仔细阅读这篇文章并动手做实验即可!
1. 权限管理
1.1 目录文件的权限管理
如果只是让所有人可以目录下的文件列表,建议只赋予
rx
权限
(1) 目录只有x
权限
能够用cd
命令将目录切换为当前工作目录current working directory
。不能够用ls -l
命令查看目录的内容(即目录下的文件列表),因为这需要目录r
权限。但是如果你知道这个目录下确实存在某个文件,可以查看这个文件信息的。
1. 首先用root用户创建测试用的目录和文件 # umask 0022 # mkdir dir1 # echo "Hello Linux" > dir1/file1 # chmod 751 dir1/ # ls -ld dir1/ drwxr-x--x 2 root root 19 Apr 11 09:56 dir1/ # ls -l dir1/ total 4 -rw-r--r-- 1 root root 12 Apr 11 09:56 file1 2. 然后用普通用户alice测试 $ ls -l dir1/ ls: cannot open directory dir1/: Permission denied $ cd dir1/ $ ls -l ls: cannot open directory .: Permission denied $ ls -l file1 -rw-r--r-- 1 root root 12 Apr 11 09:56 file1
(2) 目录只有w
权限
啥都干不了
$ ls -ld dir1/ drwxr-x-w- 2 root root 19 Apr 11 09:56 dir1/ $ ls -l dir1/ ls: cannot open directory dir1/: Permission denied $ cd dir1/ -bash: cd: dir1/: Permission denied $ ls -l dir1/file1 ls: cannot access dir1/file1: Permission denied $ touch dir1/a touch: cannot touch ‘dir1/a’: Permission denied $ mv dir1/file1 dir1/file1.bak mv: failed to access ‘dir1/file1.bak’: Permission denied $ rm -f dir1/file1 rm: cannot remove ‘dir1/file1’: Permission denied $ cp /etc/passwd dir1/ cp: cannot stat ‘dir1/passwd’: Permission denied
(3) 目录有w
+x
权限
除了拥有x
功能外,还能够创建文件、重命名文件、删除文件、将文件复制或移动到本目录下
$ ls -ld dir1/ drwxr-x-wx 2 root root 19 Apr 11 10:47 dir1/ $ ls -l dir1/ ls: cannot open directory dir1/: Permission denied $ cd dir1/ $ ls -l ls: cannot open directory .: Permission denied $ ls -l file1 -rw-r--r-- 1 root root 12 Apr 11 10:47 file1 $ touch a $ mv a a1 $ rm a1 $ cp /etc/passwd .
(4) 目录只有r
权限
能够用ls -l
命令查看目录的内容(即目录下的文件列表),但是文件的权限、属主等信息显示为问号(因为这需要目录x
权限)
$ ls -ld dir1/ drwxr-xr-- 2 root root 19 Apr 11 09:56 dir1/ $ ls -l dir1/ ls: cannot access dir1/file1: Permission denied total 0 -????????? ? ? ? ? ? file1 $ cd dir1/ -bash: cd: dir1/: Permission denied $ ls -l dir1/file1 ls: cannot access dir1/file1: Permission denied
(5) 目录有r
+x
权限
能够正常查看该目录下有哪些文件了,但是不能够
创建文件、重命名文件、删除文件、将文件复制或移动到本目录下
$ ls -ld dir1/ drwxr-xr-x 2 root root 19 Apr 11 09:56 dir1/ $ ls -l dir1/ total 4 -rw-r--r-- 1 root root 17 Apr 11 10:12 file1 $ cd dir1/ $ ls -l total 4 -rw-r--r-- 1 root root 17 Apr 11 10:12 file1 $ touch test touch: cannot touch ‘test’: Permission denied $ rm -f file1 rm: cannot remove ‘file1’: Permission denied $ mv file1 file1.bak mv: cannot move ‘file1’ to ‘file1.bak’: Permission denied $ cp /etc/passwd . cp: cannot create regular file ‘./passwd’: Permission denied
(6) 目录有r
+w
权限
能够用ls -l
命令查看目录的内容(即目录下的文件列表),但是文件的权限、属主等信息显示为问号(因为这需要目录x
权限)。由于没有x
权限,当然不能够
在目录下创建文件、重命名文件、删除文件、将文件复制或移动到本目录下
$ ls -ld dir1/ drwxr-xrw- 2 root root 19 Apr 11 10:50 dir1/ $ ls -l dir1/ ls: cannot access dir1/file1: Permission denied total 0 -????????? ? ? ? ? ? file1 $ cd dir1/ -bash: cd: dir1/: Permission denied $ ls -l dir1/file1 ls: cannot access dir1/file1: Permission denied $ touch dir1/a touch: cannot touch ‘dir1/a’: Permission denied $ mv dir1/file1 dir1/file1.bak mv: failed to access ‘dir1/file1.bak’: Permission denied $ rm -f dir1/file1 rm: cannot remove ‘dir1/file1’: Permission denied $ cp /etc/passwd dir1/ cp: cannot stat ‘dir1/passwd’: Permission denied
(7) 目录有rwx
全部权限
能够查看文件列表、创建文件、重命名文件、删除文件、将文件复制或移动到本目录下
$ ls -ld dir1/ drwxr-xrwx 2 root root 33 Apr 11 10:27 dir1/ $ cd dir1/ $ echo "This a test file" > test.txt $ cat test.txt This a test file $ mv test.txt test.txt.bak $ rm test.txt.bak $ cp /etc/passwd . $ ls -l total 8 -rw-r--r-- 1 root root 17 Apr 11 10:12 file1 -rw-r--r-- 1 alice alice 1588 Apr 11 10:27 passwd
注意:
如果目录有rwx
全部权限,就算它下面的文件权限为空,用vim打开时,是空的文本内容(因为没有r
权限),此时输入一些内容,然后用:wq!
强制保存退出,发现覆盖了原文件内容,且属主和属组也改变了!
# ls -ld dir1/ drwxr-xrwx 2 root root 6 Apr 11 11:31 dir1/ # echo "Hello Linux" > dir1/file1 # cat dir1/file1 Hello Linux # chmod 600 dir1/file1 # ls -l dir1/file1 -rw------- 1 root root 12 Apr 11 11:32 file1 $ ls -l dir1/ total 4 -rw------- 1 root root 12 Apr 11 11:32 file1 $ ls -l dir1/file1 -rw------- 1 root root 12 Apr 11 11:32 dir1/file1 $ cat dir1/file1 cat: dir1/file1: Permission denied $ echo -e "\nI love linux" >> dir1/file1 -bash: dir1/file1: Permission denied $ vim dir1/file1 使用:wq!强制保存退出 # cat dir1/file1 What happened? # ls -l dir1/file1 -rw------- 1 alice alice 15 Apr 11 11:34 dir1/file1
1.2 一般文件的权限管理
操作 | dir1/ | dir1/file1 | dir2/ | 说明 |
---|---|---|---|---|
查看 file1文件的权限、属主等详细信息 |
至少x |
要能进入dir1目录 | ||
读取 file1的文本内容 |
至少x ,建议r +x |
r |
1. 要能进入dir1目录; 2. file1要有读取权限 | |
修改 file1的文本内容 |
至少x ,建议r +x |
至少w ,建议r +w |
1. 要能进入dir1目录; 2. file1至少要有w 权限,此时不能用vim编辑,因为没有r 权限,只能用重定向> 覆盖内容或>> 追加内容。grep/sed/awk这些都不能用,因为全都要读取文件内容。 |
|
执行 file1文件 |
至少x ,建议r +x |
至少r +x |
1. 要能进入dir1目录; 2. file1至少要有r +x 权限,程序要执行需要把代码复制到内存中 |
|
删除 file1文件 |
至少w +x ,建议rwx |
需要能够修改dir1目录,参考"目录文件的权限管理"中第3条 | ||
将file1复制 到dir2/ |
至少x ,建议r +x |
r |
至少w +x ,建议rwx |
1. 要能读取file1的文本内容(cp的原理),参考本表格第2行; 2. 要能够修改目标位置dir2目录(cp的原理),参考本表格第5行 |
将file1移动 到dir2/ |
至少w +x ,建议rwx |
至少w +x ,建议rwx |
要能够同时修改起始位置和目标位置目录(mv的原理),参考本表格第5行 |
2. 文件预设权限 umask
不知道你有没有注意到,root用户新建目录文件或其它一般文件时,它们的权限是多少呢?普通用户新建文件时的权限又是多少呢?这些都与umask有关,umask是用来更改当前用户在新建目录文件或其它一般文件时的权限预设值
0 条评论
评论者的用户名
评论时间暂时还没有评论.