目录
引子 {#i}
相信不同刚接触Linux的同学都跟小白一开始一样对Linux的权限管理感到无所适从,出现很多问题也无法解决,例如明明安装了transmission,准备下载东西却提无权限,下载的脚本,却无法执行,nginx同样也是权限管理的重灾区,等等问题。那我们今天就来谈谈Linux权限管理问题,个人水平有限,如有错漏,还望见谅。
背景知识 {#i-2}
Linux中的每一个文件都属于某一个用户,而每一个用户又会从属于某一个或几个用户组。而每一个用户以及用户组都有其相对应的权限等级。同时每一个文件也会有三种不同的权限:读取(r)、写入(w)、执行(x)。并且每一个文件对于所属用户,这个用户所属的用户组,以及其他用户,分别都可以赋予不同权限,具体我们来看个例子。
我们先来看一一下这些rwx分别代表什么
当我在当前目录输入ls -lh
时,开头的第一个字符,-代表的是这个玩意是一个文件,d则代表这个玩意是一个目录。我们就拿这样图举例:
比如说,my-tools.sh这个文件,为-rwxr-xr-x
,那也就是说这玩意是一个文件,所有者为root用户,对于所有者本身权限为读取、写入、执行,对于root用户组的其他用户,权限为读取、执行,对于其他用户,权限为读取、执行。
当然我们也可以采用数字来表示rwx,其中r=4、w=2、x=1,只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式),符号模式指定文件的权限。
好,我们再来回顾下Linux的文件的基本属性:
下面我们来看看关于权限管理的几个命令,以及常用的修改权限的命令操作。
chmod {#chmod}
将文件 file1.txt 设为所有人皆可读取 :
chmod ugo+r file1.txt
将文件 file1.txt 设为所有人皆可读取 :
chmod a+r file1.txt
将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :
chmod ug+w,o-w file1.txt file2.txt
为 ex1.py 文件拥有者增加可执行权限:
chmod u+x ex1.py
将目前目录下的所有文件与子目录皆设为任何人可读取 :
chmod -R a+r *
此外chmod也可以用数字来表示权限如 :
chmod 777 file
语法为:
chmod abc file
其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。
r=4,w=2,x=1
- 若要 rwx 属性则 4+2+1=7;
- 若要 rw- 属性则 4+2=6;
- 若要 r-x 属性则 4+1=5。
chmod a=rwx file
和
chmod 777 file
效果相同
chmod ug=rwx,o=x file
和
chmod 771 file
效果相同。
至于你喜欢用数字还是字母,这个就看各人的喜好了,我是比较习惯用三位数字的。
chown {#chown}
把 /var/run/httpd.pid 的所有者设置 root:
chown root /var/run/httpd.pid
将文件 file1.txt 的拥有者设为 runoob,群体的使用者 runoobgroup :
chown runoob:runoobgroup file1.txt
将当前前目录下的所有文件与子目录的拥有者皆设为 runoob,群体的使用者 runoobgroup:
chown -R runoob:runoobgroup *
把 /home/runoob 的关联组设置为 512 (关联组ID),不改变所有者:
chown :512 /home/runoob
chgrp {#chgrp}
参数说明
-c 或 --changes:效果类似"-v"参数,但仅回报更改的部分。
-f 或 --quiet 或 --silent: 不显示错误信息。
-h 或 --no-dereference: 只对符号连接的文件作修改,而不改动其他任何相关文件。
-R 或 --recursive: 递归处理,将指定目录下的所有文件及子目录一并处理。
-v 或 --verbose: 显示指令执行过程。
--help: 在线帮助。
--reference=<参考文件或目录>: 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。
--version: 显示版本信息。
实例1:改变文件的群组属性:
chgrp -v bin log2012.log
输出:
[root@localhost test]# ll ---xrw-r-- 1 root root 302108 11-13 06:03 log2012.log
[root@localhost test]# chgrp -v bin log2012.log
"log2012.log" 的所属组已更改为 bin
[root@localhost test]# ll
---xrw-r-- 1 root bin 302108 11-13 06:03 log2012.log
说明: 将 log2012.log 文件由 root 群组改为 bin 群组。
实例2:根据指定文件改变文件的群组属性
chgrp --reference=log2012.log log2013.log
输出:
[root@localhost test]# ll
---xrw-r-- 1 root bin 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root root 61 11-13 06:03 log2013.log
[root@localhost test]# chgrp --reference=log2012.log log2013.log
[root@localhost test]# ll
---xrw-r-- 1 root bin 302108 11-13 06:03 log2012.log
-rw-r--r-- 1 root bin 61 11-13 06:03 log2013.log
说明: 改变文件 log2013.log 的群组属性,使得文件 log2013.log 的群组属性和参考文件 log2012.log 的群组属性相同。
usermod {#usermod}
实例 {#i-3}
更改登录目录
# usermod -d /home/hnlinux root
改变用户的uid
# usermod -u 777 root
将用户 rslsync
新增到当前用户所在的组,user_group
就是指当前用户所在的组,根据实际情况替换即可:
sudo usermod -aG user_group rslsync
将debian-transmission用户添加到root组
usermod -a -G debian-transmission root
P.S: 上面的 -a
参数的作用是将用户追加至 -G
参数中提到的附加组中,但并不从其它组中删除此用户。
/etc/passwd和/etc/group {#etcpasswdetcgroup}
最后我们来谈下/etc/passwd和/etc/group这两个文件,我们已经知道,Linux中有很多用户,每个用户又会从属于一个或多个用户组,并且每个用户和用户组都会有相对于的权限,而这两个文件就是定于用户和用户组权限的,如果我们实在懒话,可以直接修改这两个文件,我们先来见识下这两个文件。
/etc/passwd 存放账户信息:
root:x:0:0:root:/root:/bin/bash
jianing:x:1011:100::/home/jianing:/bin/bash
username:password:uid:gid:allname:homedir:shell
用户名:密码:用户ID:组ID:用户全名:主目录:登录shell
/etc/group 存放用户组信息
root:x:0:
test:!:1005:u01,u02,u03,cvsroot
groupname:password:gid:members
组名:密码:组ID:成员
a所以对于transmission和resilio-sync,他们会各自创建debian-transmission和rslsync用户以及用户组,我们直接暴力修改/etc/passwd,将用户ID改成0让其成为与root一样的超级用户,如果还不行,再去修改/etc/group,将用户组也全都改成0。这样当然能解决权限问题,个人玩玩可以,但是让一个软件具备超级用户的权限,在任何生产环境都是极为不安全的。
参考文献 {#i-4}
6.Linux /etc/passwd /etc/group /etc/shadow 文件的格式说明