之前摸索生信时,执行一个自己写的小脚本却失败了。后来经上网查找执行了
chmod u+x lizi.sh
就可以了。这里将学习文件权限的相关内容,就能理解那行代码是什么意思了。在学习Linux文件权限知识之前,还有必要了解下用户账户与组的概念。
要点一、Linux账户
Linux有三类用户。一是root用户账户,为Linux系统的管理员,UID为0;二是系统账户,为各种各样的功能而创建的不同的虚拟用户账户,UID为1~500;三是用户账户,为真正用户登录操作的账户,UID从500开始。
cat /etc/passwd
#该文件储存用户信息(之前学习shell类型时,了解过这个文件,这次系统学习一下)
举一用户账户例 ake:x:501:501:ake:/home/ake:/bin/bash
,以冒号为分隔,依次为
- 登录用户名--用户登录用;
- 密码--最长8位字母/数字;加密处理,保存在/etc/shadow里,只有root用户才能访问,详见p126;
- 用户UID--每一个Linux用户有唯一的UID(User ID)值;
- 用户组ID(GID);
- 备注字段(一般同登录名);
- 用户HOME目录;
- 用户默认的shell;
关于Linux用户的账户增减、信息修改操作就不介绍了,详见p127。
这里介绍一个常用的命令usermod
,可以修改/etc/passwd中的大部分字段,参数大部分与useradd参数相同p128,此外还有以下的参数。
- -l 修改用户账户的登录名
- -p 修改账户密码
- -L 锁定账户,使用户无法登陆
- -U 解锁账户
要点二、组Group
(1)组的概念
组权限允许多个同组用户对系统中的对象(文件,目录等)共享一组共用的权限。一些Linux发行版(比如Ubuntu)会为每个用户创建一个单独的与用户账户同名的用户默认组,比如上面的ake的账户信息。
(2)/etc/group文件
- 类似 /etc/passwd 存储用户信息文件,/etc/group为储存所有组的信息的文件。
cat /etc/group
举一例 ake:x:501:
,以冒号为分隔,依次为:
- 组名(注意这里是组名。如上所述,每个用户都有一个同名的默认组)
- 组密码
- GID--组的GID仍500以上
- 属于该组的用户列表 ,不要以为是没有哈!虽然为空,因为当一个用户在/etc/passwd 里已经指定该组为默认组时,这个用户账户不会作为该组成员再出现在/etc/group的组列表里了。
(3)组的操作
- 创建新组 groupadd
/user/sbin/groupadd shared #创建名为shared的新组
tail /etc/group #查看组列表,可以看出shared没有组成员
- 添加组成员
/user/sbin/usermod -G shared ake #将ake用户添加到shared组里
/user/sbin/usermod -G shared bei #将bei用户添加到shared组里
tail /etc/group #ake、bei用户被添加到shared组里
如上, -G参数表示将该组(shared组)添加到用户(bei)的属组里(即同时在两个组里),不会影响原默认组(ake的501组);如果使用 -g参数 指定的组名会替换掉该账户的默认组,要小心。
- 修改组名
/user/sbin/groupmod -n sharing shared #将组名改为sharing
要点三、文件权限(划重点!)
1、文件权限符
ls -lh #重点关注输出的第一段描述文件/目录权限的编码
例如 -rwxrw-r--
(1) 第一个字符表示对象类型
- - 表文件
- d 表目录
- l 表链接
- c 表字符型设备
- b 表块设备
- n 表网络设备
(2)剩下的九个字符:每三个按顺序分别对应属主、属组、其它用户的权限
- r 表可读
- w 表可写
- x 表可执行
ls -lh 也会给出属主、属组信息;根据/etc/group 可知道该属组的其它成员。
2、文件的默认权限
umask #通过该命令查看默认权限设置
#返回值为 0022
(1)首先要理解返回的四位数的后三位数(022),分别对应属主、属组、其它用户权限;
(2)然后要明白每种权限要由三个字符才能完整表达。所以其实那三位数022,均为八进制值,分别由3个二进制转换而来。即每一位八进制与固定的三位二进制值详细对应关系见p137,比如常见的有
- 7,代表111,为rwx权限
- 6,代表110,为rw-权限
- 4,代表100,为r--权限
- 0,代表000,为---权限
(3)最后要知道umask为掩码计算的,并非直接是022权限。若为文件用全权限666-022=644;目录用全权限777-022=755,减掉后的值即为创建文件/目录的默认权限。
- 所以022对应的是644,即为rw-r--r--
umask
touch test1
ls -lh test1
umask 026 #好像也可修改默认权限
touch test2
ls -lh test2
umask #观察有没有修改默认设置 (由于在家条案件限制,无法演练了)
3、修改对象属性
3.1修改权限
-
chmod
命令
方法一:直接修改八进制值
ls -lh test1
chmod 760 test1 #将760的权限赋给test1文件,不用考虑掩码了
ls -lh test1
方法二:符号模式
即导语所述的方法;举一例就清楚了,如下。
chmod u+x test1 #给属主添加执行命令
关键内容是中间的三个字符:
第一个为操作对象: u 表属主、g 表属组、o 表其它、a 表所有;
第二个为如何修改:+ 表增加、- 表移除、= 表设置成后面的值;
第三个为操作权限:r、w、x 还有其它权限,没怎么理解,详见p139。
3.2修改属主、属组
(1)修改属主 chown
命令
- 注意只有root用户才能改变文件属主
chown ake test1 #将test1的文件属主设置成ake
#注意格式,直接通过指定登录名/UID指定新属主
(2)修改属组 chgrp
命令
- 注意文件属主可以改变文件的属组(前提是该用户必须在那个组里,这个操作相当于把文件按组权限分享给组成员)
chgrp shared test1 #将test1的属组修改为shared
4、共享文件
- 结合上述的学习,如果想共享文件(使其它用户有组权限)的方法就是创建一个新组,添加组成员,然后修改文件的属组即可。基于上述操作都可以完成了,就是比较麻烦,比如多文件的分享,还要一个一个的修改。
- 有一种共享文件相对简单的方法---创建一个共享目录,使目录里的新文件都沿用目录的属组(不用麻烦得一一修改属组了),可能也没简便多少,哈哈~
mkdir testdir
ls -lh #查看目录属组
chgrp shared testdir #修改目录属组
ls -lh
chmod g+s testdir #启用SGID(详见p141),使目录里的新建文件都沿用目录的属组shared
ls -lh
umask 002 #所有组成员都应该增加默认属组权限
cd testdir
touch test2
ls -lh
- 综上,在该目录下创建的文件属组自动设置为shared,即shared组的所有用户都能访问这个文件了。(用户创建的文件的属组一般为创建用户的默认属组)
参考自《Linux命令行与shell脚本编程大全》