很多概念以为自己知道,实际不然,文件权限就是一个。
文件权限中的w属性对于普通文件和目录是不同的:
- 对于普通文件,可以修改文件的内容
- 对于目录,可以修改目录的内容,如增加文件,删除文件。
来看一个例子。这里面涉及2个用户:root和bill。
sudo useradd bill
sudo mkdir /usr/local/share/test
> /usr/local/share/test/foo
mkdir /usr/local/share/test/bar_dir
> /usr/local/share/test/bar_dir/bar
chmod o+w /usr/local/share/test
现在来看一下文件和目录的权限:
# ls -ld /usr/local/share
drwxr-xr-x. 7 root root 75 Aug 11 11:52 /usr/local/share
# ls -ld /usr/local/share/test
drwxr-xrwx. 2 root root 17 Aug 11 11:53 /usr/local/share/test
# ls -l /usr/local/share/test/foo
-rw-r--r--. 1 root root 0 Aug 11 11:53 /usr/local/share/test/foo
# ls -ld /usr/local/share/test/bar_dir
drwxr-xr-x. 2 root root 17 Aug 11 11:57 /usr/local/share/test/bar_dir
# ls -l /usr/local/share/test/bar_dir/bar
-rw-r--r--. 1 root root 0 Aug 11 11:57 /usr/local/share/test/bar_dir/bar
那么对于test目录和其下的目录和文件,bill用户可以操作吗?
我们先切换到用户bill:
su - bill
首先对于目录,bill用户无权删除,因为其没有上层目录/usr/local/share的w权限:
$ rm -fr /usr/local/share/test
rm: cannot remove ‘/usr/local/share/test/bar_dir/bar’: Permission denied
那么对于test目录下的foo文件呢,其实也是可以删除的,因为bill有test目录的w权限:
$ cd /usr/local/share/test
$ ls -l foo
-rw-r--r--. 1 root root 0 Aug 11 12:04 foo
$ id
uid=54322(bill) gid=54331(bill) groups=54331(bill) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ rm foo
rm: remove write-protected regular empty file ‘foo’? y
$ ls -l foo
ls: cannot access foo: No such file or directory
并且,bill用户可以在test目录中生成新文件:
$ > newfile
$ ls -l newfile
-rw-rw-r--. 1 bill bill 0 Aug 11 12:05 newfile
我们再以root用户重新生成foo文件,那么bill可以修改文件foo吗?
用vi编辑foo文件,保存时报警说是只读文件:
但是,用w!可以保存成功:
只不过owner变了:
$ ls -l foo
-rw-r--r--. 1 bill bill 25 Aug 11 12:09 foo
所以,bill可以修改文件的内容,但是不能保持原来的属主。相当于把文件删除然后自己再新建议一个。
最后对于test目录下的目录bar_dir,删除失败:
$ pwd
/usr/local/share/test
$ ls -ld .
drwxr-xrwx. 3 root root 36 Aug 11 12:15 .
$ ls -l bar_dir/
total 0
-rw-r--r--. 1 root root 0 Aug 11 11:57 bar
$ rm -fr bar_dir
rm: cannot remove ‘bar_dir/bar’: Permission denied
$ cd bar_dir
$ rm bar
rm: remove write-protected regular empty file ‘bar’? y
rm: cannot remove ‘bar’: Permission denied
这里需要说明一下,删除失败是因为其删除不了目录中的文件。如果root用户帮他把bar文件先删除,则空的目录是可以删除的:
$ id -un
bill
$ rmdir bar_dir