Linux 实操篇 - 用户管理
Linux 实操篇 - 用户管理
基本介绍
Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统
添加用户
基本语法
useradd
:新的用户名
useradd -d 指定目录 新的用户名
:其中的指定目录为指定的家目录,这个指定的目录的路径需要从根目录开始写,也就是绝对路径,当这个目录不存在的时候,Linux 会自动帮你创建不存在的目录,此外,创建用户以后,这个目录名也可以通过命令改变。特别说明:用户需要有进入到新目录的权限。
usermod --d 目录名 用户名
应用案例
细节说明
创建用户成功后,会在/home/
下自动的创建和用户同名的家目录,用户登陆的时候会自动切换到家目录,家目录用~
表示。
建立用户之后,用户主目录下是空的,
只有登录进图形页面完成用户引导之后,用户主目录下才会有内容:
为了方便使用,创建用户之后,应该立刻给用户设置密码,最好也设置用户组,具体请看后文的指定/修改密码
和用户组
小节,设置密码是个很重要的步骤,只有设置了密码,在图形页面上才会出现这个用户的登录选项,没有设置密码的用户无法登录。
而且普通用户没有权限创建用户、删除用户(包括删除自己)、设置其他用户的密码、修改其他用户的密码(当然,用户可以自己修改自己的密码),就目前来看只有系统管理员用户才可以,因为这些命令都是 sbin 目录下的命令,普通用户没有权限访问 sbin 目录。(可以通过 which 命令查看)
指定/修改密码
基本语法
passwd
:给当前登录的这个用户修改密码
passwd 用户名
:给指定的用户修改密码
应用案例
pwd
:显示当前用户所在的目录,《pwd 指令 print work directory》会细讲
删除用户
基本语法
userdel 用户名
:删除用户,删除用户的时候用户主目录不会动
userdel -r 用户名
:删除用户同时把用户主目录整个删除,也就是文件夹也没了,这个操作一定要注意,因为如果这个用户在家目录下存放了重要的资料,这个操作会把这些都删除
应用案例
细节说明
是否保留家目录的讨论?一般情况下,我们建议保留。
删除用户的时候未删除用户主目录,然后我又新建了一个同名用户,可以创建成功且正常登录。
且因为用户主目录已存在,不需要再往里填充文件,同时删除之前的用户主目录下的文件可以正常使用。
正常情况下,我们不建议把家目录连带着删除,现实工作中,一个人工作了一段时间,多少都会留下代码和资料,现在他离职了,他工作的东西多少还是有价值的,这个时候保留家目录是最稳妥的,毕竟东西被删了想找的时候找不回来了是大事,我们只用把原来的账户删掉,让原来的账户不能登录就可以了,我们可以新开一个账户,然后把把家目录绑定到这个新的账户上,这样,接替的人就可以继续用这个目录里的东西,同时账号又是新的,这样就很秒了。
另外也不要删除当前正在使用的账户(你没用,别人正在用,多用户系统嘛)
查询用户信息指令
基本语法
id 用户名
:查看指定用户的信息,用户名可以省略,此时输出的是当前登录用户的信息
id -Gn 用户名
:查看用户所在的组,用户名可以省略,此时输出的是当前登录用户的信息,效果跟 groups 命令一样
应用案例
细节说明
uid 表示用户 id,gid 表示组 id,组表示所在的组,可能会有多个组。
切换用户
介绍
su 用户名
:切换到指定用户,并开启一个交互式非登录式 shell 进程
su - 用户名
:切换到指定用户,并开启一个交互式登录式 shell 进程
不同的进程加载的配置文件不一样。要注意区分。
su
命令,不带 --login
时为交互式非登录式 shell,带有 --login
时,为交互式登录式 shell。一般我们将 su --login
缩写为 su -
。su -
、su -l
和 su --login
是等价的
关于登录式和登录式 Shell 的概念,请看《Bash 启动时的配置文件加载》
基本语法
应用案例
细节说明
su
和su -
的区别,以切换到 root 用户为例
su root
:将用户角色由普通用户切换至 root,但保留普通用户的 shell 环境
su - root
:将用户角色由普通用户切换至 root,并将 shell 环境切换为 root 的 shell 环境。su -
、su -l
和su --login
是等价的。通过 man su
可以看到原文
两者的区别:
shell 环境不同:su root
使用的是原来普通用户的 shell 环境,su - root
使用的是 root 用户的 shell 环境,具体的不同,请看《Bash 启动时的配置文件加载》
命令执行后的工作目录不同:su root
命令执行后会将目录切换至原普通用户的工作目录,su - root
命令执行后会将目录切换至 root 用户的目录
退出方式不同:su
切换用户之后,只能用exit
退出,su -
切换用户之后,既可以用logout
退出又可以用exit
退出。
在使用过程中su
和su -
除了环境变量和工作目录不相同以外,其他内容均保持一致。
此外,
从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。
当需要返回到原来用户时,使用exit
/logout
指令,这个在《Linux 实操篇 - 开机、重启和用户登录注销》的用户登录和注销
就说明清楚了
查看当前用户/登录用户
基本语法
whoami
;显示的是当前用户下的用户名(切换用户会影响其结果)
who am I
:显示的是登录时的用户名(切换用户不会影响其结果)
who:显示当前真正登录系统中的用户(不会显示那些用 su 命令切换用户的登录者),具体请查看《who》
whoami
如果报错id: cannot find name for user ID xxx
,而且Shell提示行原本应显示用户名的位置被I have no name!
代替,
|
|
那就是因为/etc/passwd
和/etc/group
中 other权限太小,执行下面的命令
|
|
用户组
介绍
类似于角色,系统可以对有共性/权限的多个用户进行统一的管理(这个比喻非常到位)。当然,用户可以属于多个组,不过只有一个主组,而其他组称为附加组
在实际的工作中,不同的项目开发小组的成员会属于不同的组,然后每一个开发小组的所有用户都属于同一组,有着同样的权限。这样非常方便权限控制。
新增组
groupadd 组名
:普通用户没有新增组删除组,编辑用户组的权限,也没有修改自己所在组的权限,目前只有系统管理员才有。也对,要是可以改的话,那用户自己就可以随意切换到权限不同的组,那组的控制就没有意义了。
删除组
groupdel 组名
案例演示
useradd -g 用户组 用户名
:在新增用户的时候通过设置-g
参数来设置用户所在的组
修改用户的组
当然如果一开始新建用户的时候没有指定组,会默认生成一个跟这个用户的用户名相同的组,然后把这个用户放到这个组里面去,就是说用户是一定有组的,之后我们可以修改用户所在的组
usermod --g 用户组 用户名
:更改用户所属组,小写,是覆盖
usermod --G 用户组 用户名
:添加用户所属组;大写,是添加
注意:修改用户组之后,在当前 shell 会话内不会立即生效,这跟一个环境变量有关,将来讲到环境变量的时候再说 TODO,你需要先 exit 退出,然后重新登录,或者直接su
当前用户($USER
)
su - $USER
相当于刷新当前 shell 会话(当然你还是要退出),有的人使用newgrp
,可以不输入密码,newgrp 指令类似 login 指令,当它是以相同的帐号,另一个群组名称,再次登入系统。
newgrp [新的群组名称]
但是结果会冗余,
反正都是远程登录,重新登录一次算了
其他
groups
:查看当前登录用户所在的组
groups 用户名
:查看用户所在的组
用户和组相关文件
/etc/passwd文件
用户(user)的配置文件,记录所有用户的各种信息。每行的含义:用户名、口令(就是密码,加密过,一般都是 x)、用户标识号、组标识号、注释性描述、主目录、登录 Shell(用户登录成功之后用的是哪一个 shell,系统里面有多个 shell)
解释一下什么是 shell:
我们敲的命令,比如 cd、ll,是无法直接被 Linux 内核识别和使用的,中间需要经过一个工具将我们的命令翻译解释成 Linux 内核可以识别的指令,这个翻译工具就是 shell,目前有很多种 shell,centos 内置 bash,还有 tcsh,csh,GitHub 上还有我将来想要学的 ohmyzsh。
centos 内置的 shell,通过在 bin 目录下执行
ls -l *sh
可以看到
在/etc/passwd
文件中记录的是用户所属的主组,没有附加组。
文件片段:
/etc/shadow文件
口令的配置文件。每行的含义:登录名、加密口令、最后一次修改时间、最小时间间隔、最大时间间隔、警告时间、不活动时间、失效时间、标志
现代的 Unix 系统使用影子密码系统,所以这个文件叫 shadow,shadow 文件只有超级管理员有权限访问,如果密码栏第一个字符为*
或者!
,表示这个号不会用来登录。没有设置密码也会是!
。设置过的密码就是一串加密字符串。
文件片段:
/etc/group文件
组 (group) 的配置文件,记录 Linux 包含的组的信息。每行含义:组名、口令、组标识号、组内用户列表
这个组内用户列表也是经过隐藏的,看不全的
片段:
为什么要创建用户?
Linux 上绝大部分的安装操作都是 root 执行的,不管是用系统包管理器还是手工编译安,即使不直接通过登录 root 用户来安装,也会通过 sudo 命令,但是安装的程序在运行的时候,则大概率会使用一个专门创建的用于运行此程序的用户,比如 Mysql 在安装过程中会创建名为 mysql 的用户和名为 mysql 的组,比如安装 Dameng 数据库会创建名为 dmdba 的用户,等等等等。为什么?主要是为了安全。
保证安全的一条最基本的原则:权限最小化,即不持有任何不必须的权限。不同的用户,会有不同的权限,能够访问不同的文件和进程。所以一个用户跑的东西有漏洞,被入侵了,攻击者的权限只能局限在那个用户的能力范围内,必须得想办法利用另外的漏洞来提权才能干更多的事情。举个例子:在一个使用独立的用户来运行不同的服务的系统中,因为你所使用的 nginx(HTTP 服务器)的漏洞,攻击者获得 nginx 用户的所有权限。然后他就能改你的网站了,也能取得入侵期间所有的用户访问。但是它访问不了你网站本身的服务(比如 php-fpm 或者 django 等),也无法访问数据库(mysql 或者 postgresql 等),能够造成的破坏就会比较有限了。而如果他得到 root 权限,想干嘛就干嘛,先把数据库拷回去一份,然后再乱改改数据,把你的业务程序拖回去,得到你们使用的一堆第三方的账号口令或者私钥什么的。用户数据、商业机密啥的都完了。软件漏洞无处不在,修了一个又出来另一个。既然没有办法根除,当然要想办法让其破坏力最小化了。systemd 还引入了更多的权限控制,比如永久性地放弃某些(或者所有)特权,比如把 /home
和 /usr
之类的挂载为只读,私有的 /tmp
和 /dev
,等等。