群组介绍
Linux中为了使用户共享文件或者其他资源方便,引入了群组的功能:
Linux中每一个用户属于一个群组(group),而每一个群组(group)都有一个group标示符,即GID. 所有群组和对应的gid都存放在根目录的/etc/group中
Linux系统在创建每一个用户时就为每一个用户创建了了一个同名的群组,并将这个用户加入到该群组中,也就是说至少每个用户都有一个同名的群组,当然也可以加入到其他群组中。加入到其他群组是为了获取适当的权限来访问特定的资源。
如果一个文件属于一个群组,则这个群组的所有用户都能存取这个文件。
/etc/group
群组信息保存在/etc/group中,控制用户如何分组。它的格式如下:
groupname:password:gid:members
/etc/group文件信息存储结构,包括4个字段用:隔开依次为:第一个字段的是组名:是群组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复
第二个字段的是口令:字段存放的是群组加密后的口令字。一般Linux系统的群组都没有口令,即这个字段一般为空,或者是x
第三个字段的是组标识号:即GID
第四个字段的是组内用户列表:每个用户之间用,号分割;本字段可以为空;如果字段为空表示群组为GID的用户名
下面是组文件的部分内容:
more /etc/group
root:x:0:
daemon:x:1:
...
第一个字段root和daemon,表示有root和daemon两个群
第二个字段x,表示root群组和daemon群组的群组密码,已经加密
第三个字段0和1,表示root群组的GID为0,daemon群组GID为1
第四个字段空,表示有root和daemon两个群组
/etc/gshadow
Linux群组密码存放在/etc/gshadow文件中,只有在特权用户才能访问。在linux中一般很少用到群组密码。
/etc/gshadow文件信息存储结构,包括4个字段用:隔开依次为:
第一个字段就是这个群的名字
第二个字段的x表示这个群组在登录这个群组的密码
第三个字段是群组的gid
第四个字段是这个群组中还有哪些成员
举例说明:显示本机群组,终端执行(只截取两段):
more /etc/group
root:x:0:
adm:x:4:cxbii
第一个字段root和adm,表示有root和adm两个群
第二个字段x,表示root群组和adm群组的群组密码,已经加密
第三个字段0和4,表示root群组的GID为0,adm群组GID为4
第四个字段为空和cxbii,表示root群组的没有成员, adm群组有cxbii一个用户
群组管理
添加群组
groupadd命令可以添加群组
语法:groupadd [-g gid [-o]] [-r] [-f] group
参数:
-g gid group’s ID 值 .除非使用
-o 参数不然该值必须是唯一, 不可相同.数值不可为负。预设为最小不得小于500而逐次增加。 0~999 传统上是保留给系统帐号使用。
-r 此 参数是用来建立系统帐号。的 UID 会比定义在系统档上/etc/login.defs. 的 UID_MIN 来的小.注意 useradd 此法所建立的帐号不会建立使用者目录,也不会在乎纪录在 /etc/login.defs. 的定义值 . 如果你想要有使用者目录须额外指定。
-m 参数来建立系统帐号。 这是 RED HAT 额外增设的选项。它会自动帮你选定一个小于999 的 gif 不需要 再加上
-g 参数。这是RED HAT 额外增设的选项。
-f 新增一个已经存在的群组帐号,系统会出现错误讯息然后结束groupadd .如果是这样的情况,不会新增这个群组(如果 是这个情况下,系统不会再新增一次)也可同时加上
-g 选项当你加上一个gid,此时 gid 就不用是唯一值,可不加 -o 参数,建好群组后会显结果
举例使用: sudo groupadd cjh ##建立cjh群组 sudo groupadd cjh #3建立cjh群组,并且在/etc/passwd文件中产生一个组ID(GID)是344的项目。
删除群组
groupdel命令可以删除群组
sudo groupdel group cjh
##删除cjh群组
设置群组密码
gpasswd命令可以设置群组密码:
sudo gpasswd group_name
取消组密码
使用gpasswd命令可以取消群组密码:
sudo gpasswd -r group_name
:取消密组码后,只有成员才可以通过newgrp命令切换入该组。
修改组成员
gpasswd命令可以修改向指定群组的用户:
语法:gpasswd[-a user][-d user][-A user,...][-M user,...][-r][-R]groupname
参数:
-a:添加用户到组
-d:从组删除用户
-A:指定管理员
-M:指定组成员和
-A的用途差不多
-r:删除密码
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组
增加群组用户
sudo gpasswd -a cxbii root
##把cxbii加入rooot群组
删除组成员
sudo gpasswd -d cxbii root
##把cxbii移出rooot群组
身份切换
拥有可以毁灭自身这样强大权限的用户只有root用户一位,但是由于root用户权限过大,直接使用root用户登陆系统操作是很危险的事情,但是部分事情只有root权限能做,那么就涉及到了身份切换.与身份切换相关的有两个命令:su和sudo.
:除非您知道您在做什么,否则请不要轻易尝试以下命令,以下命令不一定保证您操作的安全性,也不能在您发生危险动作时进行及时阻止,可能导致不可挽回的损失!
su
su:(Switch user 切换用户),可让一个普通用户切换为超级用户或其他用户,并可临时拥有所切换用户的权限,切换时需输入欲切换用户的密码;也可以让超级用户切换为普通用户,临时以低权限身份处理事务,切换时无需输入欲切换用户的密码。
使用方式:
su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]
说明:变更为其他使用者的身份,除 root 外,需要键入该使用者的密码
参数:
-f 或 --fast 不必读启动档(如 csh.cshrc 等),仅用于 csh 或 tcsh
-m -p 或 --preserve-environment 执行 su 时不改变环境变数
-c command 或 --command=command 变更为帐号为 USER 的使用者并执行指令(command)后再变回原来使用者
-s shell 或 --shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell
-help 显示说明文件
-
-version 显示版本资讯
-
-l 或 --login 这个参数加了之后,就好像是重新 login 为该使用者一样,大部份环境变数(HOME SHELL USER等等)都是以该使用者(USER)为主,并且工作目录也会改变,如果没有指定 USER ,内定是 root
USER 欲变更的使用者帐号
ARG 传入新的 shell 参数
范例:
su [用户名]
1.在root用户下, 输入 su 普通用户. 则切换至普通用户, 从root切换到变通用户不需要密码
2.在普通用户下, 输入 su [用户名] su -c ls root #变更帐号为 root 并在执行 ls 指令后退出变回原使用者。 su root -f #变更帐号为 root 并传入 -f 参数给新执行的 shell。 su - clsung #变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)。
su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell;而后者连用户和Shell环境一起切换成root身份了。
优缺点
优点:灵活的解决了身份切换问题.
缺点:su切换到特定用户需要特定用户的密码,例如切换到root下,如果10个用户需要切换到root,那么这10个用户都需要知道root的密码,那么将会增加root密码泄露的可能,并且这10个用户中有一个用户出现失误,将可能对系统造成不可挽回的灾难!
sudo
sudo是linux下常用的允许普通用户使用超级用户或者其它用户权限的工具。 sudo 对于控制和审计root用户的访问权限是极其有益的。它使得系统管理员可以将root用户的系统管理任务分配给其他人,而无需给予他们root口令。管理员也可以根据每个用户实际所需的root访问权限来定制系统访问权限,从而达到权限最小化的目标
命令格式如下:
sudo -K | -L | -V | -h | -k | -l | -vsudo [-HPSb] [-a auth_type] [-c
class|-] [-p prompt] [-u username|#uid] {-e file [...] | -i | -s | command}
下面我们再来看一下sudo其它常用的一些参数:
选项 含义 作用
sudo -h Help 列出使用方法,退出。
sudo -V Version 显示版本信息,并退出。
sudo -l List 列出当前用户可以执行的命令。只有在sudoers里的用户才能使用该选项。
sudo -u username|#uid User 以指定用户的身份执行命令。后面的用户是除root以外的,可以是用户名,也可以是#uid。
sudo -k Kill 清除“入场卷”上的时间,下次再使用sudo时要再输入密码。
sudo -K Sure kill 与-k类似,但是它还要撕毁“入场卷”,也就是删除时间戳文件。
sudo -b command Background 在后台执行指定的命令。
sudo -p prompt command Prompt 可以更改询问密码的提示语,其中%u会代换为使用者帐号名称,%h会显示主机名称。非常人性化的设计。
sudo -e file Edit 不是执行命令,而是修改文件,相当于命令sudoedit。
还有一些不常用的参数,在手册页sudo(8)中可以找到。
优缺点
优点:解决了身份切换的问题,同时避免root账户密码的泄露.
缺点:提权具有5分钟时效,即上一个命令完成后,5分钟内没有执行其他需要root权限的任务,需要重新提权.
/etc/sudoers
sudo的配置文件默认存放在/etc/sudoers下,sudo都提供了一个编辑该文件的命令:visudo来对该文件进行修改。
强烈推荐使用该命令修改sudoers,因为它会帮你校验文件配置是否正确,如果不正确,在保存退出时就会提示你哪段配置出错的。
首先写sudoers的缺省配置:
# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the sudoers man page for the details on how to write a sudoers file.
#
# Host alias specificATIon
# User alias specificATIon
# Cmnd alias specification
# Defaults specification
# User privilege specification
root ALL=(ALL) ALL
# Uncomment to allow people in group wheel to run all commands
#%wheel ALL=(ALL) ALL
# Same thing without a password
#%wheel ALL=(ALL) NOPASSWD: ALL
# Samples
#%users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
#%users localhost=/sbin/shutdown -h now
最简单的配置,让普通用户support具有root的所有权限 执行visudo之后,可以看见缺省只有一条配置: root ALL=(ALL) ALL 那么你就在下边再加一条配置: support ALL=(ALL) ALL 这样,普通用户support就能够执行root权限的所有命令 以support用户登录之后,执行: sudo su - 然后输入support用户自己的密码,就可以切换成root用户了
常见问题
忘记了登录密码,导致不能登录系统
解决方法如下:
1.正常安装到硬盘的,开机时按住Shift键,直到出现引导菜单。如果是wubi安装的,那么在Windows启动菜单处,选择深度操作系统的菜单项,按下Shift不放,再按Enter键松开,直到启动菜单出现之后,再松开Shift键。
2.然后确保光标在深度操作系统启动的一行上(正常情况是第一项),然后按下“e”键。
3.在出现的画面当中,按几下键盘的下方向键,使光标移动到“linux /boot/....”的一行.
4.按键盘的End键使得光标移动到最后(低分辨率的话则有可能是下一行,其实是同一行因为太长被截断了),先打一个空格,然后执行:
rw init=/bin/bash
5.按Ctrl-X组合键启动系统,直到出现提示符。
然后执行:
passwd
例如,如果你的用户名是sam,那么请执行passwd sam并回车。(例子图片的用户名为cxbii,所以执行的是 passwd cxbii) 然后连续执行两次新密码回车,这次可要记住了!
6.按Ctrl-Alt-Del重启,然后用新密码登录吧。
: 以上方法适合于所有使用Grub2的Linux系统,如果出于安全考虑,需要禁用到单用户模式,点击此处查看如何禁用单用户模式。
终端使用sudo提权出错
xx用户不在 sudoers 文件中。此事将被报告。
出现这个问题是sudo的配置文件出错,修改sudo的配置文件即可解决
使用su 切换到root,然后终端执行:
sudo gedit /etc/sudoers
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL) ALL
xx ALL=(ALL) ALL (将此处的XX修改为出现改问题的用户名!)
保存文件退出即可解决
为什么用户权限不默认root?
由于root的权限过大,作为日常账户使用过于危险,因此系统账户默认不是root,并且登录管理器默认屏蔽root直接登录。 如果需要临时使用root权限,我们可以使用sudo命令,临时获取root权限。 终端输入密码没有回显。
Linux系统是一个非常重视密码安全的系统,因此用户在终端输入密码时,终端将不会回显,即产生占位符(****),所以你只需要盲打密码后回车即可。
linux存储群组名称的文件是 群组管理(分组 群组密码 身份切换 常见问题)- 系统管理 -Deepin深度系统用户手册...