linux / unix 系统中文件有3种权限:
读(read),写(write),运行(execute),而这些权限通常以数字表示:
0 = 什么都不可以
1 = 执行
2 = 写入
4 = 读取
那么依照上面的最基本的权限进行搭配:
7 = 什么都可以,(读4 写2 执行1) 4+2+1=7,(读出(read),写入(write),运行(execute))
5 = 可以读和运行 (读出(read),运行(execute))
6 = 读取写入
...
每个文件有4个不同的分组权限
例如linux系统中的文件属性通常是 777 / 755 / 666 等,分别是什么意思呢?
linux系统中的文件和文件夹通常有4组:
全部用户(all)
文件用户(user)
同组用户(group)
其他用户(other)
全部用户默认权限是0,777 = 0777 前面的0不写是为了系统安全,比如你的iphone 如果给了7777 那么什么人都可以往你手机写文件了安全可想而知。
例如解读文件 755权限
文件用户:可以读出(read =4)写入(write = 2)运行(execute = 1),刚好是 4+2+1 = 7;
同组用户:读出(read),运行(execute),4+1=5;
其他用户:可以读出(read),运行(execute),4+1=5;
同样可以解读出 700, 750, 555, 777 的权限了。
新建文件和文件夹的默认权限
1. $ umask
该命令返回当前默认的新建文件和文件夹的访问权限。如:“0022”,其中后三位是读写执行权限的八进制数,表示默认不允许拥有的访问权限。在新建文件时,文件默认拥有的访问权限是“666”(即默认拥有读写权限),如果此时umask的值为“0022”,那么在新建文件时,该文件将不拥有“022”访问权限(即新建文件的权限是“644”,换成符号表示为“-rw-r--r--”);而新建文件夹默认拥有的访问权限为“777”,如果此时umask的值为“0022”,那么此时新建文件夹的默认权限为“755”,即“drwxr-xr-x”。
2. $ umask 026
设置当前默认访问权限掩码为“026”
文件和文件夹的操作权限
用户的权限
要确定一个用户对某个文件或文件夹是否具有相应的操作权限,先要明确该用户与文件或文件夹之间的关系。在 linux 系统中,定义了如下三种关系:
•文件或文件夹的所有者 (owner):文件或文件夹的拥有者,开始创建文件或文件夹时为创建者。
•组 (group):文件或文件夹所属的组, 开始创建文件或文件夹时为创建者的所属的组。
•其他人 (other):除了文件或文件夹的所有者和文件或文件夹所属的组的其他成员,剩下的 linux 的用户。
因为在 linux 下的文件和文件夹都有读取(r)、写入(w)、执行(x)的操作,所以上面描述的每种关系的用户分别都可以赋予这些操作权限。操作权限介绍:
权限 简写 对普通文件的作用 对文件夹的作用
读取 r 查看文件内容 列出文件夹中的文件(ls)
写入 w 修改文件内容 在文件夹中删除、添加或重命名文件(夹)
执行 x 文件可以作为程序执行 cd 到文件夹
文件或文件夹和用户的三种关系的基础操作权限
在 linux 使用ls -la命令可以查看文件夹内文件的属性,下面是我电脑上某个文件夹下文件的属性:
bash$ 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表示,如:
bash$ 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表示,如:
bash$ 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表示。
bash$ ls -l /
drwxrwxrwt 8 root root 4096 Apr 4 23:57 tmp
修改文件或文件夹对应用户的操作权限
在 linux 系统中,可以使用chmod命令来修改文件或文件夹对应用户的操作权限,chmod命令也有两种方式修改,一种是使用代表相应操作权限的字母简写表示,另一种是使用代表相应操作权限的数字表示。
•使用简写字母
chmod语法参数格式: [ugoa][[+-=][rwxst]
第一个字符是u、g、 o 或 a 中的一个(分别表示用户、组、其他人和所有人)。还可以选择添加(+)、删除(-)或设置(=)各种不同权限。
◦给文件或文件夹try的拥有者加可执行权限
bash$ sudo chmod u+x try
◦给文件或文件夹try的拥有者和组成员加可读可写权限
bash$ sudo chmod ug+rw try
◦给文件或文件夹try的拥有者和组成员除去可写权限
bash$ sudo chmod ug-r try
•使用数字表示(八进制数)
为了简化表述,也可使用八进制数来表示权限。即用一个四位八进制数来表示,其中最高位表示特殊权限,随后的三位依次是所有者权限、组权限和其他人权限。每一个八进制位的权限数值是文件具有的相应权限所对应的数值之后,如:
bash0755=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--权限
bash$ sudo chmod 0754 try
◦chmod命令也可以递归的修改文件夹下所有的文件的权限,如给 try 文件夹下得所有文件加上 0755 权限
bash$ sudo chmod -R 0755 try
◦批量只修改文件或文件夹权限
bash$ 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
bash$ sudo chown aikin:adm try
•和chmod一样,-R参数可以起到递归的作用
bash$ sudo chown -R aikin:adm try
创建组和用户
•组相关操作:
◦创建一个try组
bash$ sudo groupadd try
◦修改try组的名字为rename-try
bash$ sudo groupadd -n rename-try try
◦修改try组的名字为rename-try
bash$ sudo groupadd -n rename-try try
◦删除try2组
bash$ sudo groupdel try2
◦查看所有组
bash$ sudo cat /etc/group
•用户相关操作:
◦创建用户test
> 在 linux 系统上虽然可以使用useradd或adduser来创建用户,但是这两个命令是有区别的。
> 1. 使用useradd时,如果后面不添加任何参数选项,例如:$sudo useradd test创建出来的用户将是默认“三无”用户:一无Home Directory,二无密码,三无系统Shell。
> 2. 使用adduser时,创建用户的过程更像是一种人机对话,系统会提示你输入各种信息,然后会根据这些信息帮你创建新用户。
> 下面创建用户使用的是adduser命令:
bash$ 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
◦修改用户
bash$ 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
bash$ sudo userdel test
◦查看所有用户
bash$ cut -d : -f 1 /etc/passwd
// 或者
$ cat /etc/passwd |awk -F \: '{print $1}'
了解 linux 用户操作权限,安全就掌握在手中。