Linux 实操篇 - 用户管理

警告
本文最后更新于 2024-03-05,文中内容可能已过时。

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 启动时的配置文件加载》

基本语法

应用案例

细节说明

susu -的区别,以切换到 root 用户为例

su root:将用户角色由普通用户切换至 root,但保留普通用户的 shell 环境

su - root:将用户角色由普通用户切换至 root,并将 shell 环境切换为 root 的 shell 环境。su -su -lsu --login是等价的。通过 man su 可以看到原文

两者的区别:

shell 环境不同:su root使用的是原来普通用户的 shell 环境,su - root 使用的是 root 用户的 shell 环境,具体的不同,请看《Bash 启动时的配置文件加载》

命令执行后的工作目录不同:su root命令执行后会将目录切换至原普通用户的工作目录,su - root 命令执行后会将目录切换至 root 用户的目录

退出方式不同:su切换用户之后,只能用exit退出,su - 切换用户之后,既可以用logout退出又可以用exit退出。

在使用过程中susu - 除了环境变量和工作目录不相同以外,其他内容均保持一致。

此外,

从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。

当需要返回到原来用户时,使用exit/logout指令,这个在《Linux 实操篇 - 开机、重启和用户登录注销》的用户登录和注销就说明清楚了

查看当前用户/登录用户

基本语法

whoami ;显示的是当前用户下的用户名(切换用户会影响其结果)

who am I :显示的是登录时的用户名(切换用户不会影响其结果)

who:显示当前真正登录系统中的用户(不会显示那些用 su 命令切换用户的登录者),具体请查看《who》

whoami如果报错id: cannot find name for user ID xxx,而且Shell提示行原本应显示用户名的位置被I have no name!代替,

1
[I have no name!@iZbp1ag455gf8nrfdeqknwZ root]$

那就是因为/etc/passwd/etc/group中 other权限太小,执行下面的命令

1
2
chmod 644 /etc/passwd
chmod 644 /etc/group

用户组

介绍

类似于角色,系统可以对有共性/权限的多个用户进行统一的管理(这个比喻非常到位)。当然,用户可以属于多个组,不过只有一个主组,而其他组称为附加组

在实际的工作中,不同的项目开发小组的成员会属于不同的组,然后每一个开发小组的所有用户都属于同一组,有着同样的权限。这样非常方便权限控制。

新增组

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,等等。

0%