概念
linux用户分root用户和其他用户。其他用户,如:nginx
,mariadb
,nobody
等。其他用户即普通用户。linux用户的读,写,执行
权限实际上是不同用户所能访问文件的不同的假象,就是用户的权限是由组来决定的。对于用户,用户组:
1. 一个用户至少要属于一个用户组。
2. 一个用户可以属于多个用户组。
用户组主要还是方便分配权限,而用户本身差别不大,各个用户之间主要不同是:
1. 是否拥有密码
2. home目录(普通用户可以有一个以自己用户名命名的home目录,存放的地址是home/username
,root用户的home目录就是/root
)
3. shell
像nobody这样用来执行nginx的工作进程的用户,一般不分配密码和shell,甚至连home目录都没有。
为什么不分配密码?如果设置了密码,程序无法自动使用。由于不会有人使用这个用户登录系统,所以就没有必要分配shell。(备注:其实严格上说是有分配shell,只是分配的shell是/sbin/nologin这个特殊的shell,没有任何其他功能,主要功能是防止你登陆。)
拆解
linux的用户信息保存在 /etc/passwd
文件中,我们查看它看看。
cat /etc/passwd
结果如下:
root:x:0:0:root:/root:/bin/bash
……
nginx:x:1000:1000::/home/nginx:/sbin/nologin
mysql:x:1001:1001::/home/mysql:/sbin/nologin
ams:x:1002:1002:AMS Process Owner:/home/ams:/bin/bash
这里列出的每一行代表着一个用户,每一行由:
分割成几个字段,其结构:用户名:密码:UID:GID:用户全名:home目录:shell
x 密码字段全部有
x
代替了。UID: 用户id
- UID 0 root用户
- UID 1~999 占坑用户,即一些无法登录的用户(以前系统是1~499)
- UID 大于等于1000 正常用户,可登录GID: 用户组id。这里只有一个,表示的是专职用户组,一个用户只有一个专职用户组。用户其他用户组的关联关系保存在
/etc/group
中。
相关的文件:
/etc/group 保存的用户组信息。
/etc/passwd 保存用户的信息。所有用户可见。
/etc/shadow 保存用户的密码信息。包括加密后的密码,密码过期时间,密码过期提示天数等。该文件仅root用户可见。
/etc/gshadow 保存用户组的信息。
文件列表详解:ls -l
。其展示结果为7大列,如下:
drwxr-xr-x 14 ams ams 4096 Jun 5 23:02 ams
drwxr-xr-x 4 root root 4096 May 11 14:41 mariadb
drwxr-xr-x 4 root root 4096 May 11 18:30 mongodb
drwxr-xr-x 12 root root 4096 May 11 14:28 nginx
drwxr-xr-x 7 root root 4096 May 11 18:18 node.js
drwxr-xr-x 9 root root 4096 May 11 15:54 php
drwxr-xr-x 10 root root 4096 May 12 16:38 php-mongodb
drwxrwxr-x 10 root root 4096 May 11 17:06 php-redis
drwxr-xr-x 4 root root 4096 May 11 16:58 redis
第一列: 表示文件类型,权限。
第二列: 表示文件链接个数(如果是文件夹,包含一个当前目录和上级目录,是隐藏文件。可以通过 ls -a命令查看)。
第三列: 表示文件所有者
第四列: 表示文件的所在群租
第五列: 表示文件大小(以字节为单位)
第六列: 表示文件最后的更新(修改)时间。
第七列: 表示文件名或文件夹名
下边对第一列,进行详细拆分。
第一列右10个字符组成,分成四段。第一个字符表示文件的类型,比如文件夹,文件,链接等。第二到第四个字符表示文件所有者的权限。第五到第七个字符表示文件所属组的权限。第八到第十个字符表示其他用户的权限。
文件类型,大体分为以下几类:
d 目录
- 文件
l 链接
s socket
p named pipe
b block device
c character device
文件权限:
r 可读,用数字4表示
w 可写,用数字2表示
x 可执行,用数字1表示
- 无权限,用数字0表示
eg:rwx r-w ---
4 + 2 + 1 = 7
4 + 0 + 1 = 5
0 + 0 + 0 = 0
这个也就是常见的 750权限
使用
groupadd 命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
常用选项:
-g 指定新建工作组的id
-r 创建系统工作组(系统工作组id小于1000)
-p 指定密码
-o 允许组id重复
-K 覆盖配置文件/etc/login/defs
eg:
groupadd -g 1005 test
groupdel 命令用于删除指定的工作组,本命令要修改的系统文件包括/ect/group和/ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
eg:
groupdel test
groupmod 命令更改群组识别码或名称。需要更改群组的识别码或名称时,可用groupmod指令来完成这项工作。
常用选项:
-g<群组识别码>:设置欲使用的群组识别码;
-o:重复使用群组识别码;
-n<新群组名称>:设置欲使用的群组名称。
eg:
groupmod -n test1 test
useradd 命令用于创建新的用户。帐号建好之后,再用passwd设定帐号的密码。还可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd
文本文件中。创建用户的时候,如果没有指定组,则会自动创建一个和用户名一样的组。在Red Hat Linux中,adduser
命令则是useradd
命令的符号连接,两者实际上是同一个指令。
常用选项:
-c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
-d<登入目录>:指定用户登入时的启始目录;
-D:变更预设值;
-e<有效期限>:指定帐号的有效期限;
-f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
-g<群组>:指定用户所属的群组;
-G<群组>:指定用户所属的附加群组;
-m:自动建立用户的登入目录;
-M:不要自动建立用户的登入目录;
-n:取消建立以用户名称为名的群组;
-r:建立系统帐号;
-s:指定用户登入后所使用的shell;
-u:指定用户id。
eg:
useradd –g sales jack –G company,employees //-g 加入主要组,-G加入次要组
useradd test -u 1024 //指定用户id.设定的id尽量要大于1000,以免冲突。
userdel 命令用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。
常用选项:
-f:强制删除用户,即使用户当前已登录;
-r:删除用户的同时,删除与用户相关的所有文件。
eg:
userdel -r -f test
请不要轻易用-r
选项;他会删除用户的同时删除用户所有的文件和目录,切记如果用户目录下有重要的文件,在删除前请备份。
其实也有最简单的办法,但这种办法有点不安全,也就是直接在/etc/passwd中删除您想要删除用户的记录;但最好不要这样做,/etc/passwd是极为重要的文件,可能您一不小心会操作失误。
usermod 命令用于修改用户的基本信息。usermod命令不允许你改变正在线上的使用者帐号名称。当usermod命令用来改变user id,必须确认这名user没在电脑上执行任何程序。你需手动更改使用者的crontab档。也需手动更改使用者的at工作档。采用NIS server须在server上更动相关的NIS设定。
常用选项:
-c<备注>:修改用户帐号的备注文字;
-d<登入目录>:修改用户登入时的目录;
-e<有效期限>:修改帐号的有效期限;
-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
-g<群组>:修改用户所属的群组;
-G<群组>;修改用户所属的附加群组;
-l<帐号名称>:修改用户帐号名称;
-L:锁定用户密码,使密码无效;
-s:修改用户登入后所使用的shell;
-u:修改用户ID;
-U:解除密码锁定。
eg:
usermod -G staff newuser2 //将newuser2添加到组staff中
usermod -l newuser1 newuser //将newuser的用户名改为newuser1
usermod -a -G apache cnzhx //将一个已有用户cnzhx增加到一个已有用户组apache中使此用户组成为该用户的附加用户组,-a 代表 append。
chown 命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户id,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。
只有文件主和超级用户才可以便用该命令。
常用选项:
-c或——changes:效果类似“-v”参数,但仅回报更改的部分;
-f或--quite或——silent:不显示错误信息;
-h或--no-dereference:只对符号连接的文件作修改,而不更改其他任何相关文件;
-R或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
-v或——version:显示指令执行过程;
--dereference:效果和“-h”参数相同;
--help:在线帮助;
--reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;
--version:显示版本信息。
--from <当前用户:当前群组>只有当前用户和群组跟指定的用户和群组相同时才进行改变
参数:
用户:组 文件或文件夹
eg:
chown -R vini:vini /usr/vini //改变指定目录以及子目录下的所有文件的拥有者和群组
chmod 命令用来变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。
权限范围的表示法如下:
u User,即文件或目录的拥有者;
g Group,即文件或目录的所属群组;
o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围;
a All,即全部的用户,包含拥有者,所属群组以及其他用户;
r 读取权限,数字代号为“4”;
w 写入权限,数字代号为“2”;
x 执行或切换权限,数字代号为“1”;
- 不具任何权限,数字代号为“0”;
s 特殊功能说明:变更文件或目录的权限。
语法:
chmod 选项 参数
选项:
-c或——changes:效果类似“-v”参数,但仅回报更改的部分;
-f或--quiet或——silent:不显示错误信息;
-R或——recursive:递归处理,将指令目录下的所有文件及子目录一并处理;
-v或——verbose:显示指令执行过程;
--reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
<权限范围>+<权限设置>:开启权限范围的文件或目录的该选项权限设置;
<权限范围>-<权限设置>:关闭权限范围的文件或目录的该选项权限设置;
<权限范围>=<权限设置>:指定权限范围的文件或目录的该选项权限设置;
参数:
权限模式:指定文件的权限模式;
文件:要改变权限的文件。
eg:
chmod u=rwx,g=rw,o=r f01
chmod u+x,g+w f01 //为文件f01设置自己可以执行,组员可以写入的权限
chmod a+x f01 //对文件f01的u,g,o都设置可执行属性
chmod 764 f01