由于 linux 是多用户操作系统,所以基于安全的考虑,需要具备保障个人隐私和系统安全的机制。因此在使用 linux 系统的时候,经常会出现权限的问题(比如: 删除文件、安装软件、运行应用等等),期初遇到这些问题的时候,大部分都使用sudo
或者是sudo chmod 777 file
(后面会讲解这个命令)来解决的。虽然这种方式可以解决问题,但是这样是不安全的,特别是在服务器上操作的时候,因为不是所有的文件和文件夹都可以被其它用户操作的,不是所有的用户都有root
权限的,不是所有的应用都可以用root
用户启动的。那么我们要如何正确的处理这些权限问题呢?那就让我们来学习一下 linux 权限相关的知识。
用户的权限
要确定一个用户对某个文件或文件夹是否具有相应的操作权限,先要明确该用户与文件或文件夹之间的关系。在 linux 系统中,定义了如下三种关系:
文件或文件夹的所有者 (owner):文件或文件夹的拥有者,开始创建文件或文件夹时为创建者。
组 (group):文件或文件夹所属的组, 开始创建文件或文件夹时为创建者的所属的组。
其他人 (other):除了文件或文件夹的所有者和文件或文件夹所属的组的其他成员,剩下的 linux 的用户。
因为在 linux 下的文件和文件夹都有读取(r)
、写入(w)
、执行(x)
的操作,所以上面描述的每种关系的用户分别都可以赋予这些操作权限。操作权限介绍:
权限 | 简写 | 对普通文件的作用 | 对文件夹的作用 |
---|---|---|---|
读取 | r | 查看文件内容 | 列出文件夹中的文件(ls) |
写入 | w | 修改文件内容 | 在文件夹中删除、添加或重命名文件(夹) |
执行 | x | 文件可以作为程序执行 | cd 到文件夹 |
文件或文件夹和用户的三种关系的基础操作权限
在 linux 使用ls -la
命令可以查看文件夹内文件的属性,下面是我电脑上某个文件夹下文件的属性:
$ ls -la
drwxr-xr-x 14 root root 4096 Apr 3 18:47 .
drwxr-xr-x 23 root root 4096 Mar 2 05:48 ..
drwxr-xr-x 2 root root 4096 Apr 3 07:44 backups
drwxr-xr-x 17 root root 4096 Jul 22 2014 cache
drwxr-xr-x 2 root root 4096 Mar 2 04:26 docker-registry
lrwxrwxrwx 1 root root 9 Feb 25 13:31 lock -> /run/lock
drwxrwxr-x 15 root syslog 4096 Apr 3 07:44 log
-rw-r--r-- 1 root root 0 Apr 3 18:47 test
上面的有九列数据,第一列数据表示和文件或文件夹相应关系用户的操作权限,第二列表示文件夹内文件和文件夹的总数量(包括文件夹本身),第三列表示文件夹或文件的拥有者,第四列表示文件或文件夹的所属的组,第五列表示文件或文件夹的大小,第六、七、八列表示文件或文件夹最后被修改的时间,第九列文件或文件夹的名字。
接下主要分析第一列的数据,在上面的信息中倒数第二行
drwxrwxr-x
,从左到右第一个字母表示文件系统对象的类别,这里d
表示为目录(文件夹)。其它文件系统对象:
-
(常规文件)、d
(目录)、l
(符号链接)、c
(字符特殊设备)、b
(模块特殊设备)、p
(FIFO)、s
(套接字)
drwxrwxr-x
除出去第一个字母d
后的rwxrwxr-x
表示的是三种用户关系对文件或文件夹的操作权限。从左到右每三个一组,依次表示所有者权限、组权限、其他用户权限。每组的顺序均为rwx
,如果用户有相应的操作权限就用相应的字母表示,如果不具有相应的操作权限就用-
表示。比如:rwxrwxr-x
表示文件或文件夹的所有者具有rwx
(可读,可写,可执行)的操作权限,组用户也具有rwx
(可读,可写,可执行)的权限,其他用户具有r-x
(可读,可执行,没有可读)的操作权限。
特殊权限SUID
、SGID
、Sticky
在 linux 系统中还有三种与用户身份无关的三个文件权限属性。即SUID、SGID和Sticky
。
SUID(Set User ID, 4):
该属性只对有执行权限的文件有效,对目录无效。执行具有
SUID
权限的程序时,引发的进程的所有者是程序文件的所有者,而不是启动程序的用户(除非二者是同一个人)。比如,如果一个程序的所有者是root
且具有SUID
属性,一个普通用户执行此程序时,如同root
执行此程序一样。(请注意该属性对Shell
脚本程序无效)该属性为一些特殊程序(如lpr)的启动带来了方便。但有时也带来了安全隐患:比如一个具有SUID
属性的程序如果在执行时运行了一个shell
,那么用户可以籍此得到系统的最高权限。SUID
可用s
表示,如:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 47032 Feb 16 2014 /usr/bin/passwd
SGID(Set Group ID, 4):
对于可执行文件,
SGID
与SUID
类似,引发的进程的所有组是程序文件所属的组。对于目录,SGID
属性会使目录中新建文件的所属组与该目录相同。SGID
也可以用s表示,如:
$ ls -l /var
drwxrwsr-x 2 root staff 4096 Apr 10 2014 local
drwxrwxr-x 15 root syslog 4096 Apr 4 19:57 log
Sticky, 1:
仅对目录有效。带
sticky
属性的目录下的文件或目录可以被其拥有者删除或改名。常利用sticky
属性创建这样的目录:组用户可以在此目录中创建新文件、修改文件内容,但只有文件所有者才能对自己的文件进行删除或改名。如系统中的/tmp
文件夹。在属性字符串中,通常用t表示。
$ ls -l /
drwxrwxrwt 8 root root 4096 Apr 4 23:57 tmp
修改文件或文件夹对应用户的操作权限
在 linux 系统中,可以使用chmod
命令来修改文件或文件夹对应用户的操作权限,chmod
命令也有两种方式修改,一种是使用代表相应操作权限的字母简写表示,另一种是使用代表相应操作权限的数字表示。
使用简写字母
chmod
语法参数格式: ugoa[rwxst]
第一个字符是u、g、 o 或 a 中的一个(分别表示用户、组、其他人和所有人)。还可以选择添加(+)、删除(-)或设置(=)各种不同权限。
给文件或文件夹
try
的拥有者加可执行权限
$ sudo chmod u+x try
给文件或文件夹
try
的拥有者和组成员加可读可写权限
$ sudo chmod ug+rw try
给文件或文件夹
try
的拥有者和组成员除去可写权限
$ sudo chmod ug-r try
使用数字表示(八进制数)
为了简化表述,也可使用八进制数来表示权限。即用一个四位八进制数来表示,其中最高位表示特殊权限,随后的三位依次是所有者权限、组权限和其他人权限。每一个八进制位的权限数值是文件具有的相应权限所对应的数值之后,如:
0755=rwxr-xr-x=0(4+2+1)(4+0+1)(4+0+1)
数值权限的算法,比如
rw-
其实就是110
的二进制,也就是0*2^0 + 1*2^1 + 1*2^2 = 6
。有相应的权限就用1
表示,没有相应的权限就用0
表示。不过这种算法特殊权限不包含在内。
-
给文件或文件夹
try
的拥有者加rwx
权限,组用户加r-x
权限,其他用户r--
权限$ sudo chmod 0754 try
-
chmod
命令也可以递归的修改文件夹下所有的文件的权限,如给 try 文件夹下得所有文件加上 0755 权限$ sudo chmod -R 0755 try
-
批量只修改文件或文件夹权限
$ find -type d|xargs chmod 745 // 只修改文件夹权限 $ find -type f|xargs chmod 644 // 只修改文件权限 // 或者 $ chmod 745 `find 路径 -type d` // 只修改文件夹权限 $ chmod 644 `find 路径 -type f` // 只修改文件权限
相应权限的数值:
rwx
(7)、rw-
(6)、r-x
(5)、r--
(4)、--wx
(3)、-w-
(2)、--x
(1)、---
(0)suid: 符号
s
(4)sgid: 符号
s
(2)sticky: 符号
t
(1)
修改文件或文件夹的拥有者和所属的组
使用chown
可以修改文件或文件夹的拥有者和所属的组。
-
将文件或文件夹
try
的拥有者修改成aikin
,所属的组修改成adm
$ sudo chown aikin:adm try
-
和
chmod
一样,-R
参数可以起到递归的作用$ sudo chown -R aikin:adm try
创建组和用户
-
组相关操作:
创建一个
try
组
$ sudo groupadd try
修改
try
组的名字为rename-try
$ sudo groupadd -n rename-try try
修改
try
组的名字为rename-try
$ sudo groupadd -n rename-try try
删除
try2
组
$ sudo groupdel try2
查看所有组
$ sudo cat /etc/group
-
用户相关操作:
创建用户
test
在 linux 系统上虽然可以使用
useradd
或adduser
来创建用户,但是这两个命令是有区别的。
使用
useradd
时,如果后面不添加任何参数选项,例如:$sudo useradd test
创建出来的用户将是默认“三无”用户:一无Home Directory,二无密码,三无系统Shell。使用
adduser
时,创建用户的过程更像是一种人机对话,系统会提示你输入各种信息,然后会根据这些信息帮你创建新用户。
下面创建用户使用的是adduser
命令:
$ sudo adduser test
Adding user `test' ...
Adding new group `test' (1002) ...
Adding new user `test' (1001) with group `test' ...
Creating home directory `/home/test' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for test
Enter the new value, or press ENTER for the default
Full Name []: test
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
-
修改用户
$ sudo passwd test // 修改用户密码 $ sudo usermod -d /home/test -G try2 test // 将test用户的登录目录改成/home/test,并加入 try 组,注意这里是大 G。 $ sudo gpasswd -a test try // 将用户 test 加入到 try2 组。 $ sudo gpasswd -d test try2 // 将用户 test 从 try 组中移除
-
删除用户
test
$ sudo userdel test
-
查看所有用户
$ cut -d : -f 1 /etc/passwd // 或者 $ cat /etc/passwd |awk -F \: '{print $1}'
了解 linux 用户操作权限,安全就掌握在手中。