📽️

Linux 的文件权限

~ made by @zhengenze ~

分享大纲

用户与用户组
Linux文件属性
如何改变文件属性与权限
参考

用户权限

  • 我们创建了3个用户 cxf、zhouyang、zy 这3个用户都分别在/home下面有自己对应的家目录(创建用户的时候系统自动创建的)

  • 这个3个家目录的权限和所有者都是是 drwx — —
    以cxf为例

d[rwx][---][---] 14  cxf   cxf

解释:d表示这个文件的类型是 目录(directory)
rwx --- --- 后面的这个每三个分一组,表示 文件所有者,所有者所在的组的其他用户,其他组用户 对这个文件拥有的权限
[rwx] 表示文件所有有这拥有 读(read)写(write)执行(x)的权限
[---] 表示和这个用户同组的其他用户没有 读写执行的权限(root用户除外)
[---] 表示其他组的用户没有读写执行的权限(root用户除外)
第一个cxf 表示 这个文件属于cxf用户
第二个cxf 表示 属于cxf组
  • 所以当 当前用户 zhouyang 要进入/home/cxf的时候会提示Permission denied

用户和用户组

  • 首先linux的所有用户必须属于一个用户组,不能独立于组外

  • 当我们使用

    useradd test
    passwd test
    
  • 创建一个用户,并给它设置密码,系统会自动创建一个test用户组,并把test用户加入到其中。

查看用户组

在linux中所有的用户组存放在文件/etc/group中

root:x:0
mail:x:12:postfix
polkitd:x:997:
cgred:x:996:
abrt:x:173:
unbound:x:995:
tss:x:59:
libstoragemgmt:x:994:
rpc:x:32:
tcpdump:x:72:
zhouyang:x:1000:
cxf:x:1001:
zy:x:1002:
  • 上面只是这个文件的一部分
  • 可以看到上面有我们比较熟悉的root,和我们自己创建的用户组
  • 这个文件的结构是
  • 组名称:口令:组Id:组内成员
  • 其中口令为X表示 没有设置口令
  • 组内成员 :(使用gpasswd添加的用户会显示在这里)可以省略,具体的组内成员需要到/etc/passwd中查询

我们也可以使用

useradd test1 -g zhouyang  或者 useradd test1 -g 1000
passwd test1
  • 新建一个用户,并把它加入到zhouyang这个已经存在的用户组中,zhouyang是这个用户组的名称,也可以使用gid(用户组Id)

用户与用户组(续)

关于用户组的一些操作

  • 创建hello用户组,并制定gid为1010
  • 0 表示管理员(root)
  • 1 - 500 表示系统用户
  • 501 - 65535 表示普通用户
groupadd hello -g 1010,如果省略-g,则系统自动生成gid

删除用户组,如果用户组内还有用户则不能删除

groupdel hello
  • 查看用户所属的组

一个用户可以属于多个组,但是会有主组和附加组之分

groups 用户名称:显示用户所在的用户组(包括主组和附加组)

id 用户名称:显示用户的id,gid表示所属的主组 ,groups表示所有的组(包括主组和附加组)

  • 把已有用户添加到用户组或者从用户组删除。

注意删除的时候只能删除附加组,不能删除用户的主组,如果要修改用户的主组,需要其他命令。

添加
gpasswd -a 用户名 组名

删除
gpasswd -d 用户名 组名

修改组信息

修改组名称
groupmod -n newname oldname

修改组Id
group -g ngid gname

用户的一些操作命令

  • 添加用户
可以通过-g指定用户所属的用户组,如果不指定,则系统自动使用这个用户名创建一个用户组,然后把这个用户加入到其中
useradd test123 -g zhouyang

给用户指定密码
passwd test123

  • 修改用户信息
修改用户名称
usernod -l newname oldname

修改用户附加组
usermod -G groupName username

这里注意,如果之前用户属于多个用户组(附加组),使用usermod -G修改之后,会把之前的附加组都删除,只保留这一个

  • 删除用户
使用-r,把用户目录页一起删除
userdel -r 用户名

Linux文件属性

  • 文件属性解析

  • 以root的身份登入Linux之后,在命令行中输入『 ls -al 』后可以看到:

[root@www ~]# ls -al
total 156
drwxr-x--- 4 root root 4096 Sep 8 14:06 .
drwxr-xr-x 23 root root 4096 Sep 8 14:21 ..
-rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg
-rw------- 1 root root 199 Sep 8 17:14 .bash_history
-rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout
-rw-r--r-- 1 root root 100 Jan 6 2007 .cshrc
drwx------ 3 root root 4096 Sep 5 10:37 .gconf <=范例说明处
drwx------ 2 root root 4096 Sep 5 14:09 .gconfd
-rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log <=范例说明处
-rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog
[ 1 ]   [ 2 ][ 3 ][ 4 ][ 5 ]        [ 6 ]     [ 7 ]
[权限]   [连接][拥有者][用户组][文件容量][修改日期] [ 文件名 ]

1 - 权限

  • 实例中,bin文件的第一个属性用”d”表示。”d”在Linux中代表该文件是一个目录文件。

  • 在Linux中第一个字符代表这个文件是目录、文件或链接文件等等。

当为[ d ]则是目录
当为[ - ]则是文件;
若是[ l ]则表示为链接文档(link file);
若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
  • 接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。

  • 每个文件的属性由左边第一部分的10个字符来确定(如下图)。

  • 从左至右用0-9这些数字来表示。

  • 第0位确定文件类型

  • 第1-3位确定属主(该文件的所有者)拥有该文件的权限。

  • 第4-6位确定属组(所有者的同组用户)拥有该文件的权限。

  • 第7-9位确定其他用户拥有该文件的权限。

  • 其中,第1、4、7位表示读权限,如果用”r”字符表示,则有读权限,如果用”-“字符表示,则没有读权限;
  • 第2、5、8位表示写权限,如果用”w”字符表示,则有写权限,如果用”-“字符表示没有写权限;
  • 第3、6、9位表示可执行权限,如果用”x”字符表示,则有执行权限,如果用”-“字符表示,则没有执行权限。

2 - 连接

  • 第二列表示有多少文件名连接到此节点(i-node)。
  • 每个文件都会将它的权限与属性记录到文件系统的i-node中,不过我们使用的目录树却是健 用文件名来记录,因此每个文件名就会连接到一个i-node。这个属性记录的就是有多少不同 的文件名莲接到相同的一个i-node号码。

3 - 拥有者

第三列表示这个文件(或目录)的“所有者账号”

4 - 用户组

  • 第四列表示这个文件的所属用户组。

在Linux系统下,你的账号会附属于一个或多个的用户组中。

5 - 文件容量

第五列为这个文件的容量大小,默认单位为B。

6 - 修改日期

第六列为这个文件的创建文件日期或者是最近的修改日期。 这一列的内容分别为日期(月/日)及时间。如果这个文件被修改的时间距离现在太久了,那 么时间部分会仅显示年份而已。

如下所示:
[rootewww ~]# ls -l /etc/termcap /root/instal1.1og
-rw-r--r-- 1 root root B07103 Jan 7 2007 /etc/termcap
-rw-I--I-- 1 root root 42304 Sp 4 18:26 /xoot/instal1.log

如上所示,/etc/termcap为2007年所修改过的文件,离现在太远之故; 至于instal1.1og是今年(2009)所创建的,所以就显示完整的时间了。

7 - 文件名

第七列为该文件名。 这个字段就是文件名了。比较特殊的是:如果文件名之前多一个“.”,则代表这个文件为“隐 藏文件”,例如前面的.gconf那一行,该文件就是隐藏文件。你可以使用“s”及“ls-a”这 两个命令去感受一下什么是隐藏文件。

如何改变文件属性与权限

chgrp:更改文件所属用户组
chown:更改文件所有者
chmod:更改文件的权限

chgrp:更改文件所属用户组

语法:

chgrp [-R] 属组名 文件名

  • 参数选项

  • -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。

chown:更改文件所有者

语法:

chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
  • 进入 /root 目录(~)将install.log的拥有者改为bin这个账号:
[root@www ~] cd ~
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

  • 将install.log的拥有者与群组改回为root:
[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log

chmod:更改文件的权限

  • Linux文件属性有两种设置方法,一种是数字,一种是符号。

  • Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限。

  • 先复习一下刚刚上面提到的数据:文件的权限字符为:『-rwxrwxrwx』, 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:
r:4
w:2
x:1
  • 每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx—] 分数则是:
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0
  • 所以等一下我们设定权限的变更时,该文件的权限数字就是770啦!变更权限的指令chmod的语法是这样的:
 chmod [-R] xyz 文件或目录

选项与参数:

xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
  • 举例来说,如果要将.bashrc这个文件所有的权限都设定启用,那么命令如下:
[root@www ~]# ls -al .bashrc
-rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc
[root@www ~]# chmod 777 .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc
  • 那如果要将权限变成 -rwxr-xr– 呢?那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754。

符号类型改变文件权限

  • 还有一个改变权限的方法,从之前的介绍中我们可以发现,基本上就九个权限分别是:
(1)user
(2)group
(3)others
  • 那么我们就可以使用 u, g, o 来代表三种身份的权限!
  • 此外, a 则代表 all,即全部的身份。读写的权限可以写成 r, w, x,也就是可以使用下表的方式来看:

chmod  |  u  |  +(加入)  |  r  |  文件或目录
       |  g  |  -(除去)  |  w  |
       |  o  |  =(设定)  |  x  |
       |  a  |          
  • 如果我们需要将文件权限设置为 -rwxr-xr– ,可以使用 chmod u=rwx,g=rx,o=r 文件名 来设定:
#  touch test1    // 创建 test1 文件
# ls -al test1    // 查看 test1 默认权限
-rw-r--r-- 1 root root 0 Nov 15 10:32 test1
# chmod u=rwx,g=rx,o=r  test1    // 修改 test1 权限
# ls -al test1
-rwxr-xr-- 1 root root 0 Nov 15 10:32 test1
  • 而如果是要将权限去掉而不改变其他已存在的权限呢?例如要拿掉全部人的可执行权限,则
#  chmod  a-x test1
# ls -al test1
-rw-r--r-- 1 root root 0 Nov 15 10:32 test1

参考

http://www.runoob.com https://www.jianshu.com/p/0b554102ea15