linux文件权限分为 属主权限、属组权限、其他用户权限、特殊权限。
特殊权限
s:setUID, 用户执行有s权限的文件时,会以属主身份去执行。eg: 普通用户执行passwd修改密码时,会通过passwd的属主,也就是root去执行。
设置SetUID
chmod 4xxx < file-name >
chmod u+s < file-name >
取消SetUID
chmod xxx < file-name >
chmod u-s < file-name >
s:setGID, 对于文件,执行该文件时,以组权限执行。对于目录,新文件会以该目录的默认属组作为默认属组。
设置SetGID
chmod 2xxx
chmod g+s
取消SetGID
chmod xxx
chmod g-s
t:StickBit, 粘滞位,t权限的目录有wx权限,进程结束后文件依然驻留在内存中,无法被其他用户删除。
设置SBIT
chmod 1xxx < dir-name >
chmod o+t < dir-name >
取消SBIT
chmod xxx < dir-name >
chmod o-t < dir-name >
共享目录
根据setGID的特性,可以实现大范围地创建并共享文档。
先做准备工作
# 创建一个分享组
parallels@abosen:~/temp$ sudo groupadd shared
# 添加当前用户到分享组
parallels@abosen:~/temp$ sudo usermod -a parallels -G shared
# 创建新用户,并添加到分享组,-M 不创建home目录
parallels@abosen:~/temp$ sudo useradd -M person2share -G shared
# 检查结果
parallels@abosen:~/temp$ id person2share
uid=1001(person2share) gid=1002(person2share) groups=1002(person2share),1001(shared)
parallels@abosen:~/temp$ cat /etc/group | grep shared
shared:x:1001:parallels,person2share
共享目录
# 创建共享目录
parallels@abosen:~/temp$ mkdir shared_dir
parallels@abosen:~/temp$ ls -lF
total 4
drwxrwxr-x 2 parallels parallels 4096 Oct 31 15:37 shared_dir/
# 修改目录组,设置SGID
parallels@abosen:~/temp$ sudo chgrp shared shared_dir/
parallels@abosen:~/temp$ sudo chmod g+s shared_dir
parallels@abosen:~/temp$ ls -lF
total 4
drwxrwsr-x 2 parallels shared 4096 Oct 31 15:37 shared_dir/
# 注意到组权限x变为了s,设置SGID成功
# 目录下新建一个文件,该文件所属组为目录组,文件执行权限为组权限。可能需要设置umask
parallels@abosen:~/temp$ cd shared_dir/
parallels@abosen:~/temp/shared_dir$ touch testfile
parallels@abosen:~/temp/shared_dir$ ls -lF
total 0
-rw-rw-r-- 1 parallels shared 0 Oct 31 15:42 testfile
测试
# 关闭属主权限
parallels@abosen:~/temp/shared_dir$ sudo chmod u-rw testfile
[sudo] password for parallels:
parallels@abosen:~/temp/shared_dir$ ls -lF
total 0
----rw-r-- 1 parallels shared 0 Oct 31 15:42 testfile
parallels@abosen:~/temp/shared_dir$ cat testfile
cat: testfile: Permission denied
# 切换用户进行尝试
parallels@abosen:~/temp/shared_dir$ su person2share
Password:
$ ls -lF /home/parallels/temp/shared_dir/testfile
----rw-r-- 1 parallels shared 0 Oct 31 15:42 /home/parallels/temp/shared_dir/testfile
$ echo hello > /home/parallels/temp/shared_dir/testfile
$ cat /home/parallels/temp/shared_dir/testfile
hello