Linux不同的字符来区分文件类型。常见如下:
-:普通文件
d:目录文件
l:链接文件
b:块设备文件
c:字符设备文件
p:管道文件
对应目录文件,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”表示能够进入该目录。
文件的读、写、执行权限简写为rwx,数字分别4、2、1表示。文件所有者,所属组及其他用户权限之间无关联
文件权限的字符与数字表示
特殊权限:特殊权限构成了除基本用户,组和其他类型之外的第四种权限类型。
特殊权限对文件和目录的影响
umask进一步限制初始设置的权限,用于清除由该进程创建的新文件和目录的权限。
如在umask中设置了一个位,则新文件中对应的权限将被清除。
如:umask 0022则 根据目录是777 减去 umask,所有默认的目录是755,同样文件666 减去 umask 则文件是644。前导零表示特殊的用户和组权限未被清除。
umask 0777时,清除新创建文件的所有组和其他权限
uxprobe ~]# umask
0022
[root@linuxprobe ~]# touch file
[root@linuxprobe ~]# ll file
-rw-r--r--. 1 root root 0 Apr 18 21:50 file
[root@linuxprobe ~]# mkdir test
[root@linuxprobe ~]# ls -ald test
drwxr-xr-x. 2 root root 6 Apr 18 21:51 test
[root@linuxprobe ~]#
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
用户密码保存在/etc/shadow文件中。
在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。
查看passwd命令属性时发现所有者得权限由rwx变成了rws,其中x变成了s意味着该文件被赋予了SUID权限。如果原本的权限是rw-,原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。
SGID主要实现两种功能:
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
如:在某个目录中创建文件自动继承该目录的用户组
上述命令是设置好目录777权限(确保普通用户可以向其写入文件),并设置了SGID 特殊权限位。下面切换普通用户,并在该目录中创建文件,查看是否继承新创建的文# 件所在的目录的所属组名称。
chmod是用来设置文件或目录的权限,格式为“chmod [参数] 权限 文件或目录名称”, 通过数字chmod ### file|directory
chmod WhoWhatWhich file|directory
Who : 指的是u,g,o,a(代表用户,组,其他,全部)
What: 指的是+,-,=(代表添加,删除,精确)
Which: 指的是r,w,x(代表读取,写入,执行)
如:
[root@linuxprobe ~]# ll file
-rw-r--r--. 1 root root 0 Apr 18 21:50 file
[root@linuxprobe ~]# chmod 760 file
[root@linuxprobe ~]# ll file
-rwxrw----. 1 root root 0 Apr 18 21:50 file
root@linuxprobe ~]# chmod 777 file
[root@linuxprobe ~]# ll file
-rwxrwxrwx. 1 root root 0 Apr 18 22:03 file
[root@linuxprobe ~]# chmod go-rw file
[root@linuxprobe ~]# ll file
-rwx--x--x. 1 root root 0 Apr 18 22:03 file
[root@linuxprobe ~]# chmod 000 file
[root@linuxprobe ~]# ll file
----------. 1 root root 0 Apr 18 22:03 file
[root@linuxprobe ~]# chmod a+x file
[root@linuxprobe ~]# ll file
---x--x--x. 1 root root 0 Apr 18 22:03 file
[root@linuxprobe ~]#
chown是设置文件或目录的所有者和所属组,格式为“chown [参数] 所有者:所属组 文件或目录名称”
chmod和chown共性,就是针对目录进行操作时需要加上大写参数-R表示递归。
如:下面file文件的修改,结果是所有者为root和所属组为bin
[root@linuxprobe ~]# ll file
---x--x--x. 1 root root 0 Apr 18 22:03 file
[root@linuxprobe ~]# chown root:bin file
[root@linuxprobe ~]# ll file
---x--x--x. 1 root bin 0 Apr 18 22:03 file
[root@linuxprobe ~]#
SBIT(粘滞位)特殊权限位可确保用户只删除自己的文件,而不能删除其他用户的文件。
当目录被设置SBIT特殊权限后,文件其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。
其实文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限。
如:建立两个测试用户,一个用户建立文件给最大权限,别的用户是无法删除的。
[root@linuxprobe ~]# useradd zhangsan
[root@linuxprobe ~]# useradd lisi
[root@linuxprobe ~]# id zhangsan
uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan)
[root@linuxprobe ~]# id lisi
uid=1002(lisi) gid=1002(lisi) groups=1002(lisi)
[root@linuxprobe ~]# su - zhangsan
[zhangsan@linuxprobe ~]$ ls -ald /tmp
drwxrwxrwt. 19 root root 4096 Apr 18 22:21 /tmp
[zhangsan@linuxprobe ~]$ cd /tmp
[zhangsan@linuxprobe tmp]$ echo "testnihao" > tt.txt
[zhangsan@linuxprobe tmp]$ chmod 777 tt.txt
[zhangsan@linuxprobe tmp]$ ll tt.txt
-rwxrwxrwx. 1 zhangsan zhangsan 10 Apr 18 22:22 tt.txt
[zhangsan@linuxprobe tmp]$ su - lisi
Password:
Password:
su: Authentication failure
[zhangsan@linuxprobe tmp]$ exit
logout
[root@linuxprobe ~]# su - lisi
[lisi@linuxprobe ~]$ cd /tmp
[lisi@linuxprobe tmp]$ rm -f tt.txt
rm: cannot remove 'tt.txt': Operation not permitted
[lisi@linuxprobe tmp]$
要是也想对其他目录来设置SBIT特殊权限位,用chmod命令就可以了。对应的参数o+t代表设置SBIT粘滞位权限
SUID、SGID、SBIT特殊权限的设置参数
其实,SUID、SGID与SBIT也有对应的数字表示法,分别为4、2、1。也就是说777还不是最大权限,最大权限应该是7777,其中第1个数字代表的是特殊权限位。既然知道了数字表示法是由“特殊权限+一般权限”构成的。
如果权限是“rwsrwSr–”呢?首先不要慌,大写S表示原先没有执行权限,因此一般权限为rwxrw-r–,将其转换为数字表示法后结果是764。带有的SUID和SGID特殊权限的数字法表示是4和2,心算得出结果是6,合并后的结果为6764。
将权限的数字表示法转换成字符表示法的难度略微高一些,这里以5537为例讲解。首先,特殊权限的5是由4+1组成的,意味着有SUID和SBIT。SUID和SGID的写法是,原先有执行权限则是小写s,如果没有执行权限则是大写S;而SBIT的写法则是,原先有执行权限是小写t,没有执行权限是大写T。一般权限的537进行字符转换后应为r-x-wxrwx,然后在此基础上增加SUID和SBIT特殊权限,合并后的结果是r-s-wxrwt。
chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。
如果把某隐藏文件添加到文件上,命令后追加“+参数”,某隐藏功能移出文件,则追加
“-参数”。
chattr命令中用于隐藏权限的参数及作用
如:chattr +a file ; 取消用: chattr -a file
[root@linuxprobe ~]# ll file
---x--x--x. 1 root bin 0 Apr 18 22:03 file
[root@linuxprobe ~]# chattr +a file
[root@linuxprobe ~]# lsattr file
-----a------------ file
[root@linuxprobe ~]# chattr -a file
[root@linuxprobe ~]# lsattr file
------------------ file
[root@linuxprobe ~]#
lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。在linux中,文件的隐藏权限必须使用lsattr命令查看,ls命令则看不出。
[root@linuxprobe ~]# chmod 777 file
[root@linuxprobe ~]# ll file
-rwxrwxrwx. 1 root bin 0 Apr 18 22:03 file
[root@linuxprobe ~]# chattr +a file
[root@linuxprobe ~]# ll file
-rwxrwxrwx. 1 root bin 0 Apr 18 22:03 file
[root@linuxprobe ~]# lsattr file
-----a------------ file
[root@linuxprobe ~]# rm -f file
rm: cannot remove 'file': Operation not permitted
[root@linuxprobe ~]# chattr -a file
[root@linuxprobe ~]# rm -f file
[root@linuxprobe ~]#
如果对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)。
基于普通文件或目录设置ACL就是针对指定的用户或用户组设置文件或目录的操作权限。如目录设置了ACL,则目录中文件会继承ACL;如文件设置了ACL,则文件不在继承其所在目录的ACL。
setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”
setfacl命令中的参数以及作用
添加或修改用户ACL或指定用户ACL:X表示后面文件是目录才会执行,不然不会
setfacl -m -u:name:rwX file
添加或修改组ACL或指定组ACL:
setfacl -m g:name:rwx file
添加或修改其他ACL:
setfacl -m o::- file
用同一个命令添加多个条目,用逗号分隔条目列表:
setfacl -m u::rwx,g:consultants:rX,o::- file
如:设置用户在/root目录上的权限
查看文件上有哪些ACL,ls命令是看不到ACL表信息的,但是可以看到文件的权限最 后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL。
[root@linuxprobe ~]# ls -ald /root
dr-xr-x---. 17 root root 4096 Apr 18 22:38 /root
[root@linuxprobe ~]# setfacl -m u:linuxprobe:rwx /root
[root@linuxprobe ~]# ls -ald /root
dr-xrwx---+ 17 root root 4096 Apr 18 22:38 /root
[root@linuxprobe ~]#
getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”
如:用getfacl显示在root管理员家目录上设置的所有ACL信息
[root@linuxprobe ~]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:linuxprobe:rwx
group::r-x
mask::rwx
other::---
[root@linuxprobe ~]#
getfacl /root(结果中有条记录user:linuxprobe:rwx,即上面设置的)
描述 ACL操作
显示目录上的ACL getfacl /directory
具有文件读取和执行权限的指定用户 user:mary:rx file
具有文件读取和执行权限的文件所有者 user::rx file
授予目录组所有者的目录读取和写入权限 g::rw /directory
授予文件组所有者的文件读取和写入权限 g::rw file
授予指定组的目录读取、写入和执行权限 group:hug:rwx /directory
设置为默认掩码的读取和执行权限 defaultⓂ️:rx /directory
获得新文件初始读取权限、新子目录读取和执行权限的指定用户 defalut:user:mary:rx /directory
getfacl作为setfacl的输入:
getfacl file-A | setfacl --set-file=- file-B ( --set-file可接受来自文件或stdin的输入)
su命令可以解决切换用户身份的需求,强烈建议在切换用户身份时添加减号(-)。这个意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息。
sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为“sudo [参数] 命令名称”
sudo命令中的可用参数以及作用
总结来说,sudo命令具有如下功能:
限制用户执行指定的命令;
记录用户执行的每一条命令;
配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
验证密码的后5分钟内(默认值)无须再让用户再次验证密码
如果担心直接修改配置文件出现问题,则用visudo命令来配置用户权限。这个命令在配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
注:只有root管理员才可以使用visudo命令编辑sudo服务的配置文件。
如:在第99行填信息
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL
然后切换到普通用户,就可以sudo -l查看所有可执行的命令。
在实际生产中不允许某个普通用户拥有整个系统的所有命令最高执行权,因此上面的ALL参数就有些不适合了。
注:让某用户使用root管理员身份执行指定的命令,一定要给出该命令的绝对路径。
可以用whereis查看命令的绝对路径,比如cat,whereis cat
可以把上面99行改成:
99 linuxprobe ALL=(ALL) /usr/bin/cat
保存后,su – linuxprobe
cat /etc/shadow(结果是没有权限打开)
sudo cat /etc/shadow (可以看到里面的内容了)
注:上面每次sudo都要验证下密码,可以添加NOPASSWD参数,使得用户执行sudo命令时不再需要密码验证。linuxprobe ALL=NOPASSWD : /usr/sbin/poweroff