用户和组的管理命令
用户管理命令
- useradd
- usermod
- userdel
组账号维护命令
- groupadd
- groupmod
- groupdel
一.用户创建:useradd
1.创建用户
默认值设定:/etc/default/useradd(查看命令“useradd -D”)
注释:
1.当我们创建用户不使用参数时(例如useradd 用户名),用户的UID、家目录等信息有一个默认值,就存放在/etc/default/useradd文件里。
2.当我们创建好用户,查看用户家目录会发现里面有一些隐藏文件,这些隐藏文件的模板就存放在/etc/skel文件夹里,并且这些模板也是隐藏文件,查看使用“ls -a /etc/skel”。重要的是,如果我们在/etc/skel文件夹里创建文件(不区别创建的是否是隐藏文件),在新建用户后,查看该用户家目录的隐藏文件,会发现你创建的那个文件。
显示或更改默认设置
创建用户的格式:
useradd [options] LOGIN[options]选项参数如下:
-u UID
-o 配合-u 选项,不检查UID的唯一性
-g GID 指明用户所属基本组,可为组名,也可以GID
-c "COMMENT“ 用户的注释信息
-d HOME_DIR 以指定的路径(不存在)为家目录
-s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
-G GROUP1[,GROUP2,...] 为用户指明附加组,组须事先存在
-N 不创建私用组做主组,使用users组做主组
-r 创建系统用户 CentOS 6: ID<500,CentOS 7: ID<1000
-m 创建家目录,用于系统用户
-M 不创建家目录,用于非系统用户创建用户的参数还可以搭配使用
useradd -d
useradd –d -s SHELL
useradd –d –b BASE_DIR
useradd –d –g GROUP
练习题
1.创建用户gentoo,附加组为bin和root,默认shell为/bin/csh,注释信息为
"Gentoo Distribution"
2.创建下面的用户、组和组成员关系:
名字为webs 的组
用户nginx,使用webs 作为附加组
用户varnish,使用webs 作为附加组
用户mysql,不可交互登录系统,且不是webs 的成员,nginx,varnish,
mysql密码都是magedu
新建用户的相关文件和命令
- /etc/default/useradd
- /etc/skel/*
上面两个文件在“注释”里已说明 - /etc/login.defs
此文件定义了新建用户账户全部的默认设置
-
newusers 批量创建用户,密码不会被同步,所以配合chpasswd批量创建密码
命令格式:newusers 特定格式的文件
批量创建用户示例:1.在Linux系统centos7,复制/etc/passwd文件里的用户到新文件user.txt(注意用户格式)
2.将文件user.txt传输到另一个Linux系统centos6
3.在centos6上批量创建用户:newusers user.txt
4.查看是否批量创建成功:getent passwd
注意:这些批量创建的用户没有密码口令,所以要借助下面的命令“chpasswd”来批量创建口令。 -
chpasswd 批量修改用户的密码口令,一般配合上面的newusers使用
单个修改用户密码口令
echo 用户名:密码 | chpasswd
批量修改用户密码口令
1.创建一个密码文件passwd.txt(格式:每行“用户名:密码”)
2.批量修改密码 cat passwd.txt | chpasswd
3.验证(每设置或修改一个东西,都要验证,这样出错后立马就能知道,而且考试如果没有验证步骤直接挂)
2.修改用户属性
一般创建用户后不会经常修改用户的属性,在搭建服务用不同用户测试的时候可能会较多用到。
命令格式:usermod [OPTION] login
[options]选项参数如下:
-u UID: 新UID
-g GID: 新主组
-G GROUP1[,GROUP2,...[,GROUPN]]]:新附加组,原来的附加组将会被
覆盖;若保留原有,则要同时使用-a选项
-s SHELL:新的默认SHELL
-c 'COMMENT':新的注释信息
-d HOME: 新家目录不会自动创建;若要创建新家目录并移动原家数据,
同时使用-m选项
-l login_name: 新的名字
-L: lock指定用户,在/etc/shadow 密码栏的增加"!"号
-U: unlock指定用户,将 /etc/shadow 密码栏的"!"号拿掉
-e YYYY-MM-DD: 指明用户账号过期日期
-f INACTIVE: 设定非活动期限(即不登录多少天就锁住)
3.删除用户
命令格式:userdel [OPTION]... login
[options]选项参数如下:
-r: 删除用户家目录
注意:带“r”删除用户,是删除用户和用户的数据
不带“r”删除用户,只删除用户,用户的数据删除不了。
4.查看用户相关的id信息
经常用来,判断这个用户存在不存在。
命令格式:id [OPTION]... [USER]
[options]选项参数如下:
-u: 显示UID
-g: 显示GID
-G: 显示用户所属的组的ID
-n: 显示名称,需配合ugG使用
5.切换用户或以其他用户身份执行命令
切换用户分两种:“部分切换”和“完全切换”,二者不用比较用哪个好,根据不同的需求进行选择。区分二者,可以查看家目录进行区分,我一般喜欢用完全切换。重要的是,切换用户后,想退出,一定要输入“exit”退出,而不是“用切换命令切换到以前的用户”!
命令格式:su [options...] [-] [user [args...]
部分切换:su 用户名
完全切换:su - 用户名
- 完全切换到管理员root:“su -”和“su - root”
- root 切换至其他用户无须密码;非root用户切换时需要密码
- "su -"与“su -l”和“su --login”的效果一样,但一般用"su -",比较方便。
有时候我们切换到root,只是想查看一个普通用户没有权限的文件,可切换过去,看完再切换回来会很麻烦,有一个“- c”的参数可以解决此问题。
示例:普通用户niubin切换root用户查看文件,查看完直接退出
格式:su - root -c "cat 文件路径"
6.设置密码
命令格式:passwd [OPTIONS] UserName
修改指定用户的密码,常用选项如下:
-d:删除指定用户密码
-l:锁定指定用户
-u:解锁指定用户
-e:强制用户下次登录修改密码
-f:强制操作
-n mindays:指定最短使用期限
-x maxdays:最大使用期限
-w warndays:提前多少天开始警告
-i inactivedays:非活动期限
--stdin:从标准输入接收用户密码,这个选项很常用,示例如下:echo "用户要设置的密码" | --stdin 用户名
7.修改用户密码策略
命令格式:chage [OPTION]... LOGIN
使用此命令和修改“/etc/shadow”文件一样,但建议使用命令修改,不要修改“/etc/shadow”文件。常用的选项如下:
-d LAST_DAY
-E --expiredate
-I --inactive
-m --mindays
-M --maxdays
-W --warndays
-l 显示密码策略示例:
chage -d 0 tom 下一次登录强制重设密码
chage -m 0 –M 42 –W 14 –I 7 tom
chage -E 2016-09-10 tom
二.组创建:group
1.用户组的创建
命令格式:groupadd [OPTION]... group_name
常用选项如下:
-g GID 指明GID号;
-r 创建系统组(CentOS 6: ID<500;CentOS 7: ID<1000)
2.修改组的属性
命令格式:groupmod [OPTION]... group
常用选项如下:
-n group_name: 新名字
-g GID: 新的GID
3.删除组
groupdel GROUP
注意:我们删除一个组时可能会报错说删除不了,是因为这个组是一个用户的主组,想要删除这个组,先把这个用户删除在删这个组。(或者把这个用户的主组指定到别的组)
4.更改组的密码(控制辅助组,不是主组)
命令格式:gpasswd [OPTION] GROUP
常用选项如下:
-a user 将user添加至指定组中
-d user 从指定组中移除用户user
-A user1,user2,... 设置有管理权限的用户列表
临时切换主组(不常用)
newgrp命令:临时切换主组
如果用户本不属于此组,则需要组密码
5.更改和查看组成员(控制辅助组,不是主组)
命令格式:groupmems [options] [action]
常用选项如下:-g, --group groupname 更改为指定组 (只有root)
常用参数如下:
-a, --add username 指定用户加入组
-d, --delete username 从组中删除用户
-p, --purge 从组中清除所有成员
-l, --list 显示组成员列表groups [OPTION].[USERNAME]... 查看用户所属组列表
传统文件权限
一.文件属性
使用"ls -l 文件名"或"ll 文件名"查看文件的属性,如上图所示。下面我们具体聊聊文件属性格式7个分段的含义:
1.“文件所有者”和“文件所属组”
和表面意思一样,“文件所有者”和“文件所属组”不做多解释。重点需要知道怎么改“文件所有者”和“文件所属组”。
- chown 设置文件的所有者
- chgrp 设置文件的属组信息
修改文件的属主(所有者)和属组(所属组)
修改文件的属主:chown
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [选项] [所有者]:[所属组] 文件 (冒号可以用“.”代替)
选项有:-R 递归修改文件的属组:chgrp
chgrp [OPTION]... GROUP FILE...
chgrp [选项] [所属组] 文件 (冒号可以用“.”代替)
选项有:-R 递归
2.文件权限
文件的权限主要针对三类对象进行定义
- owner 属主, u
- group 属组, g
- other 其他, o
每个文件针对每类访问者都定义了三种权限
- r Readable (读取)
- w Writable (修改)
- x eXcutable(执行)
文件:
r 可使用文件查看类工具获取其内容
w 可修改其内容
x 可以把此文件提请内核启动为一个进程
目录(文件夹):
r 可以使用ls查看此目录中文件列表
w 可在此目录中创建文件,也可删除此目录中的文件
x 可以使用ls -l查看此目录中文件元数据(须配合r),可以cd进入此目录
X 只给目录x权限,不给文件x权限
文件的类别
可以看到文件属性最开始的字符是“-”,这个代表文件,“d”代表目录,“”
3.文件权限操作
文件权限操作命令:chmod
文件权限(rwx|X)
文件权限操作分两种:“模式法”和“数字法”
- 重点:目录里的文件能不能删除,在于“用户对目录”有没有删除的权限,而不是“用户对目录里文件”有没有删除的权限。(删文件是修改了目录的属性如节点编号)
- 大写“X”权限只能加在目录上,代表的含义是:给此目录和子目录添加“执行”权限,对于子文件,如果原来“属主、属组、其他人”这任意一个有“执行”的权限,那目录添加大写“X”权限后,子文件都有执行的权限;如果子文件原来没有执行权限,那目录添加大写“X”权限后,子文件不会有“执行”权限。
模式法
格式:chmod who opt per file
who:u(属主),g(属组),o(其他人),a(所有人,包含u,g,o)
opt:+(添加),-(删除),=(等于)
per:r(读取),w(修改),x(执行)示例:给文件f1.txt的属主添加“rw”的权限
chmod u+rw f1.txt
或者chmod u=rw f1.txt
数字法
原理:
数字法是根据模式法来的。它把有权限的用1表示,没权限的用0表示,然后得出
3组由0和1组合的数字。把这3组数字看做二进制,接下来我们把二进制转换为
十进制,得出3个数字,如下面示例:
属主 属组 其它人
rwx rw- r--
111 110 100(有权限的用1表示,没权限的用0表示)
7 6 4(转换为十进制)
由上面总结得出:r=4;rw=6;rwx=7最后就是r=4,w=2,x=1
r = 4
w = 2
x = 1
例如:
640 rw-r-----
755 rwxr-xr-x
0 --------- (0表示什么权限都没有)
命令格式:chmod 数字 文件或文件夹
面试题
- 提问:用户wang复制一个文件到一个目录,需要什么权限。
答:用户wang对文件有读取的权限,对目录有写和执行的权限,这两个是最基础的。 - 提问:用户mysql删除了自己的家目录,怎么恢复?
答:分三步。- cp -a /etc/skel /home/mysql 复制用户家目录的隐藏文件,每个用户都有,模板是"/etc/skel"文件夹里的隐藏文件。
- chown -R mysql:mysql /home/mysql/ 更改用户家目录其里面的文件和文件夹的“属主、属组"
- chmod 700 /home/mysql 更改用户mysql的家目录的“属主、属组”
4.ls -alR /home 查看
3.文件和文件夹的默认权限
1.间接修改
有时候我们发现,“管理员root创建的文件和文件夹”与“普通用户创建的文件和文件夹”的权限不一样。比如说:root新建文件的权限都是“622”,普通用户新建的文件全是“755”。这是因为系统有一个指令“umask”,它间接的影响了新建文件和文件夹的权限。
直接输入umask可看到umask的值。
因为“执行”权限的操作很危险,如果一个病毒脚本拥有了“执行”权限,后果是你运行这个文件就会中病毒。可谁知道它是不是病毒文件呢?所以,系统默认将文件的“执行”权限都去掉了,文件夹如果去掉“执行”权限就进入不了文件夹,所以没被去掉。
而我们新建文件和新建文件夹的权限是怎么来的呢?就是(umask公式):
0777 - umask值 = 新建文件夹权限
0666 - umask值 = 新建文件权限
结论:umask的值越大,新建文件和文件夹的权限就越小,系统就越安全。
修改umask
- 临时生效,退出后就会失效:umask 数字
- 永久生效:只对当前用户永久生效。编辑用户家目录的隐藏文件“.bashrc”,添加“umask 数字”,退出重新登录后生效。如不想退出,使用“source 文件路径”可立马生效。
- 对所有用户永久生效(不建议):修改“/etc/bashrc”,添加“umask 数字”,“source 文件路径”立马生效。但是,不建议修改此文件,会不稳定!!!
2.正确修改umask
上面说的umask公式其实不准确,是有错误的。比如说:
设置umask的值是145,那root新建文件的权限是666-145=521.
属主和其他人都有“执行”权限,这样很危险。
新建文件,查看权限可得出,权限是622,并不是521.
新建文件夹的权限是632.所以这个公式对文件夹是有效的,没问题的。
那新建文件的权限到底是怎么算出的呢?
原理:
假设设置umask的值是145,那么文件权限值的算法过程如下。
第一步:转换十进制为二进制“666转成110110110”,“145转成001100101”
第二步:将“umask的二进制”和“666的二进制”进行对位,“umask的二进制”是0的,“666的二进制”相应的位保持不变,例如是1就是1。“umask的二进制”是1的,“666的二进制”相应的位也是1,那么1变为0;如果不是1是0,那么保留“666的二进制”位。
转换前:
110110110
001100101
转换后:
110010010
第三步:将转换后的二进制,三个位为一组,在转换为十进制,得出结果是622.
简便算法:
权限值= “666 - umask值(结果有奇数,奇数加1;偶数保留)”
总结:
- 对目录:权限值 = 777 - umask值;对文件:权限值= “666 - umask值(结果有奇数,奇数加1;偶数保留)”
- umask -p 可用于重定向,比如重定向到用户的家目录的“.bashrc”文件。
- 用户家目录“.bashrc”文件里,如果有两条设置umask的命令,那么最下面那条生效。会覆盖上面的命令。
- 查看umask的值:umask(或者 umask -S )
特殊权限
- SUID, SGID, Sticky
- 数字法表示“SUID, SGID, Sticky”是“4,2,1”
- 三种常用权限:r, w, x --> user, group, other
- 安全上下文
- 前提:进程有属主和属组;文件有属主和属组
(1) 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有
执行权限
(2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
(3) 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件“其它”权限
1.SUID权限
- SUID作用:作用于二进制可执行的文件的所有者位上
-
SUID功能:执行此文件的用户将临时继承此文件所有者的权限
- SUID只对二进制可执行程序有效
- SUID设置在目录上无意义
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有
执行权限 - 启动为进程之后,其进程的属主为原程序文件的属主
- 有SUID权限的文件都是红色的
权限设定:
chmod u+s 文件路径
chmod u-s 文件路径
2.SGID权限
可执行文件上的SGID权限
- SGID作用:作用于二进制可执行的文件的所属组位上
-
SGID功能:执行此文件的用户将临时继承此文件所属组的权限
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有
执行权限 - 启动为进程之后,其进程的属组为原程序文件的属组
权限设定:
chmod g+s 文件路径
chmod g-s 文件路径
目录上的SGID权限
- SGID作用:作用于目录的所属组位上
-
SGID功能:此目录中新建文件的所属组将自动从此目录继承
- 默认情况下,用户创建文件时,其属组为此用户所属的主组
- 一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件
所属的组为此目录的属组 - 通常用于创建一个协作目录
权限设定:
chmod g+s 目录路径
chmod g-s 目录路径
3.Sticky
- sticky作用:作用在目录
-
sticky功能:此目录的文件只能被所有者或root删除
- sticky设置在文件上无意义
- sticky只作用在“其它人”位上
设定文件特定属性
因为root账户权限太大,容易误删除。通过设定文件特定属性,约束root账户。
- “chattr +i 文件路径” 使用此命令,所以用户包括root不能“删除、改名、更改”文件
注释:“chattr”修改的不是文件的权限,而是文件的特殊属性 - “chattr +a 文件路径” 只能追加内容,不能删除文件和修改文件里的内容。
- "lsattr 文件路径" 显示文件特定属性
总结
特殊权限 和 特殊属性 依赖Linux的文件系统,如果换一个文件系统,使用特殊权限和特殊属性的命令将不生效,例如Windows系统的“NTFS32文件系统”
访问控制列表
上面的权限设置(基本权限、特殊权限、特殊属性)都属于“传统权限”,操作起来很麻烦,有的功能还无法实现(例如用root用户创建一个文件,在文件原有属性不变的情况下,让用户wang不能访问,传统的就不行,但ACL可以。),只能控制(属主、属组、其他人)简单的权限。不如ACL强大,下面我们来说明ACL。
- ACL:Access Control List,实现灵活的权限管理
- ACL生效顺序:所有者,自定义ACL用户,自定义ACL组,其他人
- 除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
- CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
- CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test
1.添加ACL
setfacl -m u:用户名:权限 文件或目录
setfacl -m g:组名:权限 文件或目录
添加ACL权限后,查看文件属性会出现+号。并且,添加了ACL权限后,所属组的权限不是所属组了,是ACL中mask的权限,具体解释在下面的“查看ACL”。
2.删除ACL
- setfacl -x u:用户名 文件或目录
- setfacl -X 文件或目录
- 有时候使用“-x”参数删除ACL后,在查看文件或目录会看到“+”号依然存在,证明删除ACL不彻底,那么就可以使用setfacl -b 文件或目录(目录要加-R参数)就可以彻底清除ACL,达到还原文件或目录权限属性的效果。
3.查看ACL
getfacl 文件或目录
示例:
- mount -o acl /directory因为Centos7之前的ACL不是默认安装,所以用到ACL需要安装。这个命令是“给目录挂载特殊权限ACL”,“-o”参数是挂载特殊权限的意思。
- getfacl file |directory查看文件或目录的ACL
- setfacl -m u:wang:rwx file|directory给用户设置ACL权限
- setfacl -Rm g:sales:rwX directory递归的给目录及其里面的文件设置组的ACL
- setfacl -M file.acl file|directory将ACL权限设置在文件里,通过调用文件,设置文件或ACL的权限。
- setfacl -m g:salesgroup:rw file| directory给组设置ACL权限
- setfacl -m d:u:wang:rx directory参数“-d”是给文件或目录设置默认的ACL权限,之后再次目录下创建文件会继承目录的权限,相当于“继承”的效果
- setfacl -x u:wang file |directory删除用户ACL的权限
- setfacl -X file.acl directory参数“-X”是删除“file.txt”文件里的权限,可参考“-M”参数
查看f1.txt的ACL,如下所示:
注意:
设置了ACL后,“ll 文件”(查看文件属性),所属组的权限就不是所属组了,是mask的权限了
"mask"的作用
1.作用:
限制文件或目录的最好权限,所用用户、组的权限都不能比mask的权限>高
2.适用性:
比如一个文件给10个用户设置了ACL,我的用户权限高,有的低,后>来感觉不安全,要把10个用户的权限设置小一点,一般就得一个一个的去改,但是>直接设置mask的权限,所有用户不能超过mask权限,就能很快的解决问题,不用>再每一个去设置。
3.更改“mask”权限
1.setfacl -m mask::权限(rwx) 文件---》两个“:”号之间的是mask原来的>>权限
2.chmod g=rw 文件 --->设置“文件”的mask为“读写”的权限4.总结:
更改所属组的权限就是更改“mask”权限,所以用传统命令"chmod"更改所属组的>>权限后,“mask”权限也会被更改。
更改文件ACL的权限后,“mask”权限也会更改
更改“mask”权限后,其他所有的用户和组就不能超过“mask”权限。
4.备份和恢复ACL
1.备份或复制一个文件或目录,想保留原有的权限和属性,包括ACL,使用“-p”、“-a”参数。例如:cp -p 源文件/目录 目标文件/目录
2.主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是
tar等常见的备份工具是不会保留目录和文件的ACL信息恢复示例:
getfacl -R /tmp/dir1 > acl.txt(把/tmp/dir1里的所有文件放到acl.txt文件)
setfacl -R -b /tmp/dir1(彻底清空/tmp/dir1的ACL权限)
setfacl -R --set-file=acl.txt /tmp/dir1(使用--set-file=acl.txt把/tmp/dir1的ACL权限恢复)
setfacl --restore acl.txt(“--set-file=acl.txt”参数和“--restore acl.txt”效果等同)
getfacl -R /tmp/dir1(查看/tmp/dir1里所有文件的ACL权限)
5.其他ACL命令参数:
setfacl -k 目录 (清除默认的ACL权限,可参考“-d”参数)
setfacl -b 文件 (清除所有ACL权限)
getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2
--set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含
UGO的设置,不能象-m一样只是添加ACL就可以示例:
>>setfacl --set u::rw,u:wang:rw,g::r,o::- file1
6.练习题
- 在/testdir/dir里创建的新文件自动属于webs组,组apps的成员如:
tomcat能对这些新文件有读写权限,组dbs的成员如:mysql只能对新文
件有读权限,其它用户(不属于webs,apps,dbs)不能访问这个文件夹 - 备份/testdir/dir里所有文件的ACL权限到/root/acl.txt中,清除
/testdir/dir中所有ACL权限,最后还原ACL权限