五、理解Linux文件权限

学习到这里,我发现我的macOS系统已经不够用了,又不想在自己的电脑上装Linux系统,所以是时候真正的搞个Linux系统来练习了,于是我就在京东云上申请了个免费的云服务器,系统是CentOS 7.2 64位(新用户免费一个月)继续学习😆

命令 作用
useradd 创建一个账户
userdel 删除账户
usermod 修改账户
passwd 修改密码
chpasswd 批量修改密码
chsh 修改用户登录的默认shell
chage 命令配合参数修改各种账户的有效期
groupadd 创建组
groupmod 修改组
umask 修改文件默认权限
chmod 已创建文件权限修改
chown 改变文件属主或属组
chgrp 改变文件的属组

1.Linux的安全性

Linux安全系统的核心用户账户,每一个进入Linux系统的用户都会有一个唯一分配的账户,用户对各种对象的访问权限取决于他们登录系统时用的账户
每个账户有唯一的UID,有自己的密码,有自己的登录名,系统只要控制每个账户的权限,就可以控制整个系统的安全

passwd文件 将登录名和UID匹配的文件
做下面的操作 cat /etc/passwd,查看passwd文件内容

[root@jdu4e00u53f7 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:997:995:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
centos:x:1000:1000:Cloud User:/home/centos:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin

文件中列出了各种账户,这些账户叫做系统账户,主要作用是各种进程之间访问资源,就像前面说的,所有运行的服务都要有一个系统账户登录到Linux系统上,才会拿到系统资源

*注意 上面第二行的root账户是Linux的系统管理员,他的UID固定是0

下面以root账户为例介绍一下上面的文件中的内容都代表什么

root:x:0:0:root:/root:/bin/bash
信息(以:分隔) 描述
root 用户登录名
x 用户密码
0 用户账户的UID
0 用户账户的组ID(GID)
root 用户账户的文本描述
/root 用户HOME目录的位置
/bin/bash 用户的默认shell

*注意 大家会发现密码都是x,其实不是的,为了安全起见,密码被单独保存在另外一个叫shadow的文件中,下面介绍一下这个文件

做如下操作 cat /etc/shadow

[root@jdu4e00u53f7 ~]# cat /etc/shadow
root:$6$Z9Jjj18u77$70syd1z4TXOBY1O1I9z.:17393:0:99999:7:::
bin:*:16659:0:99999:7:::
daemon:*:16659:0:99999:7:::
adm:*:16659:0:99999:7:::
lp:*:16659:0:99999:7:::
sync:*:16659:0:99999:7:::
shutdown:*:16659:0:99999:7:::
halt:*:16659:0:99999:7:::
mail:*:16659:0:99999:7:::
operator:*:16659:0:99999:7:::
games:*:16659:0:99999:7:::
ftp:*:16659:0:99999:7:::
nobody:*:16659:0:99999:7:::
avahi-autoipd:!!:17151::::::
systemd-bus-proxy:!!:17151::::::
systemd-network:!!:17151::::::
dbus:!!:17151::::::
polkitd:!!:17151::::::
tss:!!:17151::::::
postfix:!!:17151::::::
sshd:!!:17151::::::
centos:!!:17345:0:99999:7:::
nscd:!!:17382::::::
ntp:!!:17382::::::

下面还是以root账户为例介绍一下上面的文件中的内容都代表什么

root:$6$Z9Jjj18u77$70syd1z4TXOBY1O1I9z.:17393:0:99999:7:::
信息(以:分隔) 描述
root 和passwd文件对应的用户名
$6$Z9Jjj18u77$70syd1z4TXOBY1O1I9z. 加密后的用户密码
17393 距离上次修改密码后的天数(自1970.1.1开始计算)
0 多少天后才能更改密码
99999 多少天后必须更改密码
7 密码过期前提前多少天提醒用户更改密码

*注意 后面还有两个::他们中间的信息分别是
密码过期后多少天禁用用户账户
用户账户被禁用日期
预留字段给将来使用

添加新用户 useradd

useradd命令会创建一个账户,他有许多参数,这里有个链接useradd命令详解
创建时可以根据对应的参数,设置账户的具体信息

如果不填写这些参数,系统会为新用户默认添加一些信息,这些信息可以用命令/usr/sbin/useradd -D查看,如下
例:

[root@jdu4e00u53f7 ~]# /usr/sbin/useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

这些信息从上到下分别是账户组ID(GID)、账户的HOME目录位置、密码过期后不会被禁用、账户未设置账户过期日期、新账户的默认shell、系统会将/etc/skel的文件复制到用户的HOME目录下、创建一个用于接收邮件的文件

*注意 SKEL=/etc/skel意识是将/etc/skel的文件复制到用户的HOME目录下,实际上这些复制的文件就是bash shell的标准启动文件
*注意 useradd默认不会创建HOME目录,必须添加参数-m才可以

下面是创建一个默认账户的例子

[root@jdu4e00u53f7 ~]# useradd -m test
[root@jdu4e00u53f7 ~]# ls -al /home/test
总用量 12
drwx------  2 test test  59 8月  15 15:47 .
drwxr-xr-x. 4 root root  30 8月  15 15:47 ..
-rw-r--r--  1 test test  18 12月  7 2016 .bash_logout
-rw-r--r--  1 test test 193 12月  7 2016 .bash_profile
-rw-r--r--  1 test test 231 12月  7 2016 .bashrc

*注意 不传参数创建的账户的默认信息也是可以更改的,例如useradd -D -s /bin/tsch就会将创建的账户的默认shell更改为tsch

下面是更改默认值的参数介绍

参数 描述
-b 更改默认HOME目录位置
-e 更改默认新账户的过期日期
-f 更改默认新用户从密码过期到禁用的天数
-g 更改默认组
-s 更改默认登录shell

删除用户 userdel

userdel只是删除passwd文件中的关于该账户的信息,而不会删除其他该账户的文件
例:userdel test

加上-r参数会删除用户的HOME目录以及邮件目录,但是系统上仍有可能存在删除账户的其他文件
例:userdel -r test

*注意 使用-r参数时要小心,因为你不知道在删除账户的HOME目录下是否存放着其他用户的重用文件

修改用户

下面是一些修改用户的常用命令

参数 描述
usermod 修改用户账户的字段,还可以指定主要组以及附加组的所属关系
passwd 修改密码
chpasswd 从文件中读取登录名密码对,更新密码
chage 修改密码过期日期
chfn 修改账户的备注信息
chsh 修改默认登录shell

下面介绍一下这几个命令

usermod能够修改/etc/passwd文件中的大部分字段,参数和useradd差不多,例如: -c修改备注字段、-e修改过去日期等,除此之外有几个很有用的参数
-l 修改用户账户的登录名
-L锁定账户
-p修改账户密码
-U解除锁定

例:

usermod -l test1 test

将账户test的登录名改为test1

passwd修改密码,看下面的例子:

[root@jdu4e00u53f7 ~]# passwd test
更改用户 test 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
抱歉,密码不匹配。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

*注意 从修改失败的提示可以看出,密码是有要求的,必须不少于8个字符另外还不可以是纯数字
*注意 只有root用户和用户本省可以修改自己的密码

chpasswd可批量修改用户密码,该命令能够从标准输入读取用户名和密码对列表,分别修改

chsh修改用户登录的默认shell
例:

[root@jdu4e00u53f7 ~]# chsh -s /sbin/nologin test
Changing shell for test.
Shell changed.

chfn会将用于finger命令的信息存储进备注字段

[root@jdu4e00u53f7 ~]# chfn test
Changing finger information for test.
名称 []: This is a test
办公 []: test
办公电话 []: 12344445555
住宅电话 []: 12344445555

Finger information changed.

*注意 由于finger命令可以简单的查到用户信息,所以很多Linux发行版上都没有默认安装该命令

经过上面的一系列修改,现在查看test账户是这样的

test:x:1001:1001:This is a test,test,12344445555,12344445555:/home/test:/sbin/nologin

chage命令配合参数修改各种账户的有效期

参数 描述
-d 设置上次修改密码到现在的天数
-E 设置密码过期的天数
-I 设置密码过期到锁定账户的天数
-m 设置修改密码之间最少要多少天
-w 设置密码过期前多久出现提醒信息

*注意 输入日期的格式有两种,一种是YYYY-MM-DD的格式,一种是1970年1月1日到该日期的天数

2.使用Linux组(GID)

当多个账户要共享资源时,组的存在就很有用了,每个组有自己的权限,每个组下有多个用户,这些用户共享组的权限

查看组信息 /etc/group文件中
例:查看组信息 cat /etc/group

[root@jdu4e00u53f7 ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:centos
tty:x:5:
test:x:1001:

adm:x:4:centos组为例介绍下信息

信息(以:分隔) 描述
adm 组名
x 组密码
4 组ID(GID)
centos 属于该组的用户列表

*注意 添加用户到组可以用usermod命令,不能直接通过修改文件操作
*注意 组的用户列表信息会误导人,列表中有很多组后面没有这个信息,不代表该组下没有用户,当用户在/etc/passwd文件中指出默认组的时候,该成员就不会出现在这个信息中

创建组 groupadd

例:创建一个叫test_group的组

/usr/sbin/groupadd test_group

例: 将test用户添加到test_group组中

/usr/sbin/usermod -G test_group test

这时查看test_group的信息为

test_group:x:1002:test

*注意 只能用户添加到组中,不能组主动添加某个用户
*注意 更改登录系统用户所属的用户组,必须登录用户登出在登录后才会生效
*注意 -G参数的作用是将用户添加到组的列表中,还有一个参数-g是将账户的默认组设定为指定的组名

修改组 groupmod

groupmod有两个有用的参数
-g修改组的GID
-n修改组名

例: 将组名test_group改为test_group1

/usr/sbin/groupmod -n test_group1 test_group

*注意 改组名不会影响组的权限,应为权限是根据GID来的

3.文件权限

首先用ls -l命令查看下系统上的文件,取出其中一条,介绍下文件权限
以下面这条信息为例:

dr-xr-xr-x.  2 root root 20480 8月   8 18:40 bin

其中第一个参数dr-xr-xr-x就表示了文件的权限

这是一个10个字符的字符串,第一位代表对象的类型
上例中的d代表目录,还有其他的

参数 代表
- 代表文件
d 代表目录
l 代表连接
c 代表字符型设备
b 代表块设备
n 代表网络设备

后面的9个字符分为三组,从前往后分别表示文件属主的权限、属组成员的权限和其他用户的权限

每组由三个字符构成,每个字符分别代表不同的意思

参数 代表
- 无操作
r 可读
w 可写
x 可执行

这三个字符的组合会有8中形式,与八进制转二进制的前八中组合对应

参数 二进制值 八进制值 权限描述
--- 000 0 无任何权限
--x 001 1 可执行
-w- 010 2 可写
-wx 011 3 可写可执行
r-- 100 4 可读
r-x 101 5 可读可执行
rw- 110 6 可读可写
rwx 111 7 可读可写可执行

结合上面的介绍,上面那句话的意思是
登录名为root的用户可以读可以执行,root组的成员可读可执行,不属于root组的用户可读可执行

文件默认权限修改 umask

首先我们创建一个文件

[root@jdu4e00u53f7 ~]# touch newfile
[root@jdu4e00u53f7 ~]# ls -al newfile
-rw-r--r-- 1 root root 0 8月  16 15:34 newfile

这个文件的默认权限是-rw-r--r--
这个默认的权限对应的就是umask的权限

查看umask命令

[root@jdu4e00u53f7 ~]# umask
0022

对于输出结果我们可能已经懵逼了,到底什么意思,似乎和想象的不太一样

首先第一位代表的是安全特性,叫做粘着位,后面会介绍,后面三位代表的是权限,但是似乎和应该的八进制数不太吻合,正常rw-r--r--对应的二进制应该是110100100对应的八进制应该是644为什么这里显示的是022
实际上这里显示的是掩码,对于文件来说,全权限值是666(可读可写可执行),减掉对应的644就是022

*注意 对于目录来说,全权限值是777

可以用umask命令设置umask的默认值
例如umask 026,就将默认的文件权限变成了640,默认的目录权限751

上面介绍的是改变默认的文件权限,下面介绍一下已经创建好的文件权限

已创建文件权限修改 chmod
例:

[root@jdu4e00u53f7 ~]# chmod 660 newfile
[root@jdu4e00u53f7 ~]# ls -al newfile
-rw-rw---- 1 root root 0 8月  16 15:34 newfile

修改权限相对来说就比较友好,后面直接跟八进制的数字就好

除了上面的直接修改,还有一种符号模式的修改,相对来说复杂一些,格式是
[ugoa][+-=][rwxXstugo]
其中第一个中括号中代表要修改的目标

参数 目标
u 代表用户
g 代表组
o 代表其他
a 代表上诉所有

第二个中括号中的参数代表增加减少或者直接设置成后面的权限

第三个中括号是权限,会发现比普通的rwx多,增加参数的权限描述如下

参数 目标
X 如果对象是目录或者它已有执行权限,赋予执行权限
s 运行时重新设置UID或GID
t 保留文件或目录
u 将权限设置为跟属主一样
g 将权限设置为跟属组一样
o 将权限设置为跟其他用户一样

用例子解释:

[root@jdu4e00u53f7 ~]# chmod o+r newfile
[root@jdu4e00u53f7 ~]# ls -al newfile
-rw-rw-r-- 1 root root 0 8月  16 15:34 newfile

上面的例子就是为newfile文件的其他用户增加可写权限

改变文件所属关系 chown chgrp

chown改变文件属主或属组

将newfile文件的属主设定为test用户
例:

[root@jdu4e00u53f7 ~]# chown test newfile
[root@jdu4e00u53f7 ~]# ls -l newfile
-rw-rw-r-- 1 test root 0 8月  16 15:34 newfile

chown命令还可以同时改变文件的属主和属组
例:

[root@jdu4e00u53f7 ~]# chown test.test newfile
[root@jdu4e00u53f7 ~]# ls -l newfile
-rw-rw-r-- 1 test test 0 8月  16 15:34 newfile

chown命令改变文件的属组
例:

[root@jdu4e00u53f7 ~]# chown .root newfile
[root@jdu4e00u53f7 ~]# ls -l newfile
-rw-rw-r-- 1 test root 0 8月  16 15:34 newfile

如果属主和属组名字相同可用下面的写法将其同时修改
例:

[root@jdu4e00u53f7 ~]# chown test. newfile
[root@jdu4e00u53f7 ~]# ls -l newfile
-rw-rw-r-- 1 test test 0 8月  16 15:34 newfile

*注意 只有root用户才能改变文件的属主

chown改变默认属组
例:

[root@jdu4e00u53f7 ~]# chgrp root newfile
[root@jdu4e00u53f7 ~]# ls -l newfile
-rw-rw-r-- 1 test root 0 8月  16 15:34 newfile

4.共享文件

文件共享是通过GID来实现的,我们知道,新建的文件,都会分配默认的UID和GID,要想让其他人能够使用该文件,要么改变其他用户的所在组的访问权限,要么就给文件分配一个包含其他用户的新默认属组

下面用例子说明
例:
创建一个文件夹,作为要共享的文件夹

[root@jdu4e00u53f7 ~]# mkdir testdir
[root@jdu4e00u53f7 ~]# ls -l
总用量 0
drwxr-xr-x 2 root root 6 8月  16 18:08 testdir

将文件夹的默认属组改成包含要用这个文件夹的用户的组test

[root@jdu4e00u53f7 ~]# chgrp test testdir/
[root@jdu4e00u53f7 ~]# ls -l
总用量 0
drwxr-xr-x 2 root test 6 8月  16 18:08 testdir

保证目录中新建的文件都用test组作为默认属组

[root@jdu4e00u53f7 ~]# chmod g+s testdir/
[root@jdu4e00u53f7 ~]# ls -l
总用量 0
drwxr-sr-x 2 root test 6 8月  16 18:08 testdir
[root@jdu4e00u53f7 ~]# cd testdir/
[root@jdu4e00u53f7 testdir]# touch testfile
[root@jdu4e00u53f7 testdir]# ls -l
总用量 0
-rw-rw-r-- 1 root test 0 8月  16 18:10 testfile

这样操作后,不管是谁在该目录下创建新文件,新文件的属组都是目录的默认属组,而不是用户的默认属组,这样,test组下所有的用户都能访问这个文件了

*注意 上面用到了前面介绍的改变权限的一个属性s运行时重新设置UID或GID
*注意 其实共享文件涉及到Linux为文件或目录存储的额外三个信息SUID(设置用户ID)、SGID(设置组ID)和粘着位,但是这里不想过多的介绍,那样容易乱,感兴趣的同学可自行了解
*注意 上面的例子主要用的就是SGID,启用SGID位后,可以强制在一个目录下创建的文件都属于该目录的属组,这样就达到了共享的目的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,097评论 18 139
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,013评论 2 34
  • 昨晚坐在床上看完浙江卫视第十期的《熟悉的味道》时,被纪录片中海清与发小深深地友谊所感染了。 海清与发小相识于上小学...
    青竹风吟阅读 739评论 0 1
  • 只想找个心静的地方记录考研的苦逼生活
    找个地方记录考研狗生活阅读 186评论 0 0
  • 最近的生活方式不太好,晚上总是睡得很晚,于是人变笨了,记忆力下降,思维迟钝。最奇葩的是我还给自己定了早起的规矩,每...
    瓦尔登湖lake阅读 126评论 7 2