8 Linux实操篇-用户管理

8 Linux实操篇-用户管理

文章目录

  • 8 Linux实操篇-用户管理
    • 8.1 添加用户
    • 8.2 指定/修改密码
    • 8.3 删除用户
    • 8.4 切换用户
    • 8.5 查询用户信息/查看用户
    • 8.6 用户组
    • 8.7 用户和组相关文件

  • 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。
  • 可能会用到的资料有如下所示,下载链接见文末:
  1. 《鸟哥的Linux私房菜 基础学习篇 第四版》1
  2. 《鸟哥的Linux私房菜 服务器架设篇 第三版》2
  3. 《韩顺平_2021图解Linux全面升级》3

  本章介绍Linux中有关“用户管理”的操作,比如针对单个用户进行创建、删除、修改密码、查询信息,以及针对用户组进行创建、删除、更改用户所在组等。注意本章的操作都需要管理员权限! 也就是要使用root账户来完成对于用户的操作。

8.1 添加用户

  Linux系统天然就是一个 多用户多任务 的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员(root账户)申请一个账号才能进入系统,这个账号默认存储在家目录/home下。下面是添加用户的基本语法以及相应的示例图:

# 基本语法-添加用户
useradd 用户名                  # 自动的创建和用户同名的家目录
useradd -d 指定目录 新的用户名   # 给新创建的用户指定家目录,注意这个目录的名称可以和用户名不一致。
Linux系统
usradd tom
usradd -d /home/test milan
/home/tom
root
tom
milan
/home/test
图8-1 在root账户创建新的用户

如上图所示,直接使用useradd tom创建账户tom后,其目录就默认存储在家里目录下/home/tom;而指定目录创建账户milan后,其就存储在设定好的目录/home/test下。注意,如果没有特殊情况,所有的账户都应该存储在家目录/home下以方便管理

8.2 指定/修改密码

创建好了账户后自然也想为该账户创建密码:

# 基本语法-创建密码
passwd 用户名   # 为指定账户创建密码
passwd          # 为当前账户创建密码!
# 下面是一个易混淆的指令
pwd             # 显示当前用户在哪个目录下,后面会经常用到

注意点:

  1. 在设置的过程中,即使提示“无效的密码,密码少于8个字符”等提示也不要紧,再输入一遍密码即可设置通过。
  2. 如果想重新设置密码,只需要按照上述流程再走一遍即可,新密码会覆盖旧密码。

8.3 删除用户

# 基本语法-删除用户
userdel 用户名      # 删掉账户有关内容,但是保留家目录
userdel -r 用户名   # 将用户及其家目录一起删掉,包括其在家目录中存储的所有资料,谨慎!!

注意点:

  1. 第一条指令只是删除该用户登录系统的权限,但是其保存过的资料还都存储在家目录中。但第二条指令会将该用户家目录中的全部文件都删掉,所以实际生产环境中一定要谨慎。
  2. 删除用户的时候尽量保证此用户不处于登录状态,尤其是通过su - 用户名跳转过的状态非常危险。所以建议对用户进行添加/删除等操作时,断开连接并重新登录root账户

8.4 切换用户

前面说到,由于root权限很高,所以实际生产环境中基本上都只是登录到普通账户及进行开发等工作,只有特殊情况下才会切换到root账户,那执行这个切换过程的语句就是:

# 基本语法-切换用户
su - 用户名 # 切换到高权限用户

注意点:

  1. 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。
  2. 当需要返回到原来用户时,使用exit/logout指令。更具体的介绍见7.2节。

8.5 查询用户信息/查看用户

  • id可以查询有效用户的uid(user id)、gid(group id)、所在的“组”。当用户不存在时,返回无此用户。
  • whoami可以查询当前有效用户的名字。
  • who可以查询当前登录在系统上的登录用户的信息,也就是最开始的登录账户的信息。
  • who am i等同于 who -m,只打印执行该命令的登录用户的信息及时间,也就是最开始的登录账户的信息。
# 下面是从root用户登录,切换到jerry普通用户后,上述指令运行结果
[jerry@CentOS76 ~]$ id
uid=1006(jerry) gid=1008(jerry)=1008(jerry) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[jerry@CentOS76 ~]$ whoami
jerry
[jerry@CentOS76 ~]$ who
root     pts/0        2023-07-16 16:32 (192.168.8.1)
[jerry@CentOS76 ~]$ who am i
root     pts/0        2023-07-16 16:32 (192.168.8.1)

注意点:

  1. 上述“有效用户”和“登录用户”的区别是,经过账户切换指令su - 用户名后,“有效用户”指的是当前状态的账户,“登录用户”指的是最初登录系统的账户。

具体可以查看知乎文章“Linux 命令之who、who am i、whoami 的区别”。

8.6 用户组

Linux系统
Group a
Group b
milan
king
tom
jack
图8-2 将用户分组的示例

  Linux最优秀的地方之一在于它的“多人多任务”环境。实际开发中,常有多个团队共同使用一个Linux系统,这些团队之间不希望互相“串门”,但是团队内部希望可以“互通有无”,并且还希望有一个领导者(不是root账户)可以同时管理某些团队。那这个时候就需要将用户进行分组,以方便系统对有共性(权限)的多个用户进行统一的管理。如上图中,tomjack两个账户同属于用户组amilanking两个账户同属于用户组b。下面是对用户组进行操作的一些基本语法。

# 基本语法-组操作
groupadd 组名           # 新增组
groupdel 组名           # 删除组,注意只有组里面没用户的时候才能删除组
useradd -g 用户组 用户名 # 增加用户时直接加上组
usermod -g 用户组 用户名 # 修改用户的组

注意点:

  1. 如果在定义一个用户的时候没有声明组,那么它自己就默认属于自己的同名组。
  2. 于是若先创建一个声明组的用户,那么即使将该用户移动到其他组时,该同名组也会被保留下来。
  3. 小技巧:vim /etc/group可以查看当前系统中所有的组。下一小节继续介绍。

【演示1】:增加一个用户zwj,直接将他指定到wudang。

 groupadd wudanguseradd -g wudang zwjid zwj//输出结果
uid=1001(zwj) gid=1001(wudang)=1001(wudang)

【演示2】:按照图8-2所示,将存在的四个用户分组。

//1. 添加用户,并不声明组
useradd tom
useradd jack
useradd milan
useradd king
//2. 添加组
groupadd a
groupadd b
//3. 修改用户组
usermod -g a tom
usermod -g a jack
usermod -g b milan
usermod -g b king
//4. 删除原来的同名组
groupdel tom
groupdel jack
groupdel milan
groupdel king
//5. 查看用户信息,这段直接放命令行窗口的整个内容
[root@CentOS76 etc]# id tom
uid=1002(tom) gid=1006(a)=1006(a)
[root@CentOS76 etc]# id jack
uid=1003(jack) gid=1006(a)=1006(a)
[root@CentOS76 etc]# id milan
uid=1004(milan) gid=1007(b)=1007(b)
[root@CentOS76 etc]# id king
uid=1005(king) gid=1007(b)=1007(b)
//6. 查看当前系统中所有的组,直接看/etc/group的最后几行
wudang:x:1001:
a:x:1006:
b:x:1007:

8.7 用户和组相关文件

  那现在我们可以创建很多用户并将这些用户分组,那我们该如何得知当前Linux系统中,都有哪些用户组,这些用户组中又有哪些用户呢?于是就需要查看/etc文件夹中相应的文件。下面给出基本语法即文件的每行含义:

# 基本语法-查看用户和组相关文件
vim /etc/passwd # 用户配置文件:记录所有用户的基本信息
# 每行含义>>  用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shellvim /etc/shadow # 口令配置文件:记录所有用户的密码信息
# 每行含义>>  登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志vim /etc/group  # 组配置文件:记录所有的用户组
# 每行含义>>  组名:口令:组标识号:组内用户列表

下面的代码使是在上一小节“用户组”的基础上,直接查看各文件的最后几行:

vim /etc/passwd
# /etc/passwd的最后几行
zwj:x:1001:1001::/home/zwj:/bin/bash
tom:x:1002:1006::/home/tom:/bin/bash
jack:x:1003:1006::/home/jack:/bin/bash
milan:x:1004:1007::/home/milan:/bin/bash
king:x:1005:1007::/home/king:/bin/bashpasswd zwj # 为zwj用户设置密码为zwj
vim /etc/shadow
# /etc/shadow的最后几行
zwj:$6$KiSPrSlv$v9PYZsSgse4NytT6y6Dzdw/spup6bkuslahPlIlU1rEbSqhHn6vwiPjxWIdCMdLxXgTLjyxM38XMXcgWJRJvw1:19554:0:99999:7:::
tom:!!:19554:0:99999:7:::
jack:!!:19554:0:99999:7:::
milan:!!:19554:0:99999:7:::
king:!!:19554:0:99999:7:::vim /etc/group
# /etc/group的最后几行
wudang:x:1001:
a:x:1006:
b:x:1007:

  上面在“用户配置文件”/etc/passwd提到了“登录Shell”这个概念,“Shell”可以简单的理解为Linux指令的“解释器”,使得Linux内核可以执行相应的指令。Linux系统中不止有一种Shell,要想查看Linux的其他Shell,可以使用以下指令查看。根据输出的结果,当前系统存在bash、chsh、csh、tcsh等:

cd /bin
ls -l *sh
# 下面是输出的结果
-rwxr-xr-x. 1 root root    2668 610 2014 amuFormat.sh
-rwxr-xr-x. 1 root root  964536 41 2020 bash
-rws--x--x. 1 root root   23880 101 2020 chsh
-rwxr-xr-x. 1 root root 7565536 930 2020 crash
lrwxrwxrwx. 1 root root       4 713 17:09 csh -> tcsh
-rwxr-xr-x. 1 root root    4629 41 2020 gettext.sh
-rwxr-xr-x. 1 root root     277 101 2020 gvfs-trash
-rwxr-xr-x. 1 root root   15864 413 2018 lchsh
-rwxr-xr-x. 1 root root   11416 116 2016 ldns-nsec3-hash
-rwxr-xr-x. 1 root root    2291 731 2015 lesspipe.sh
-rwxr-xr-x. 1 root root    5470 101 2020 lprsetup.sh
-rwxr-xr-x. 1 root root   11592 116 2016 nettle-hash
-rwxr-xr-x. 1 root root   15424 413 2018 pax11publish
-rwxr-xr-x. 1 root root   34620 41 2020 rescan-scsi-bus.sh
-rwxr-xr-x. 1 root root    1539 1211 2019 setup-nsssysinit.sh
lrwxrwxrwx. 1 root root       4 713 17:07 sh -> bash
-rwxr-xr-x. 1 root root  774568 89 2019 ssh
-rwxr-xr-x. 1 root root   23736 1014 2020 stapsh
-rwxr-xr-x. 1 root root  404640 101 2020 tcsh
-rwxr-xr-x. 1 root root    4165 101 2020 unix-lpr.sh
-rwxr-xr-x. 1 root root   11424 812 2017 xrefresh

遗留问题: 貌似将用户添加进组中后,然后将同名组删了之后,root就没有权限切换到这些账户了。但仍有权限切换这些账户的组,在创建新的同名组并将其移入之后,也无法解决上述问题,如下:

[root@CentOS76 ~]# su - tom
上一次登录:日 716 16:28:50 CST 2023pts/0 上
su: 警告:无法更改到 /home/tom 目录: 权限不够
-bash: /home/tom/.bash_profile: 权限不够
-bash-4.2$ 

  1. 《鸟哥的Linux私房菜 基础学习篇 第四版》 ↩︎

  2. 《鸟哥的Linux私房菜 服务器架设篇 第三版》 ↩︎

  3. 《韩顺平_2021图解Linux全面升级》 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/9946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tauri在github上进行自动更新打包并发版过程,实战操作避坑

从网上找了很多很多的文章,结果还是入坑了,一个问题找了一天才解决: Error A public key has been found, but no private key. Make sure to set TAURI_PRIVATE_KEY environment variable. 596 ELIFECYCLE  Command failed with exit code…

k8s exam

Pause 容器是 Pod 中的第一个启动的容器,其他所有的用户容器都是其子进程当 Pod 被从节点中删除时,与之关联的 emptyDir 中的数据也将被永久删除。持久存储用PV,PVCService 资源定义了如何访问应用,但实际的网络流量管理和路由是由…

【树莓派】用于处理 I2C、SPI 和 UART 的C++库

一、说明 Raspberry Pi 是一款单板计算机,现在有 4 个修订版和一个简约的零变体。它是不同项目的热门选择,因为它体积小,功耗高,处理速度快,并且是一台完整的基于Linux的计算机。 连接多台单板计算机和/或微控制器的一…

智慧消防:如何基于视频与智能分析技术搭建可视化风险预警平台?

一、背景分析 消防安全是一个重要的话题,涉及到每个人的生活和安全。每年都会发生大量的火灾,给人们带来极大的危害,摧毁了大量的财产,甚至造成了可怕的人员伤亡。而消防安全监督管理部门人员有限,消防安全监管缺乏有…

Java读取外链图片忽略ssl验证转为base64

最近在对接外部接口时遇到返回的图片所在的服务器全都没有ssl证书,导致在前端直接用img标签展示时图片开裂。于是转为通过后端获取,绕过ssl验证之后转为base64返回。记录一下代码段。 package com.sy.ai.common.utils;import cn.hutool.core.codec.Base…

SVN - 记录一下无法提交代码 提示:被锁定(locked)

今天遇到一个问题,svn 在提交代码的时候出现了svn is already locked,导致代码无法提交(commit)和更新(update) 主要报错如下: 解决方法: 然后点击 Clean up 选中一下选项&#xff…

List、Numpy、Tensor操作基础

要想代码写的顺手, l i s t 、 n u m p y 、 t e n s o r 的操作一定要烂熟于心 要想代码写的顺手,list、numpy、tensor的操作一定要烂熟于心 要想代码写的顺手,list、numpy、tensor的操作一定要烂熟于心 一、list列表 1.1 list创建 list …

WPF实战学习笔记20-设置首页启动页

文章目录 设置首页启动页增加配置接口添加接口文件:实现接口 配置启动选项 设置首页启动页 增加配置接口 添加接口文件: Mytodo.Common/IConfigureInterface.cs using System; using System.Collections.Generic; using System.Linq; using System.T…

k8s 将pod节点上的文件拷贝到本地

要将 Kubernetes&#xff08;k8s&#xff09;中 Pod 节点上的文件拷贝到本地&#xff0c;可以通过使用 kubectl cp 命令来实现。kubectl cp 命令允许你在本地系统和 Pod 之间复制文件和目录。 下面是使用 kubectl cp 命令的语法&#xff1a; kubectl cp <namespace>/&l…

Linux centos7.x系统 下没有ens33 网卡的解决方案

一、背景 安装完windows11 Centos7.9 版本的双系统之后 , 启动Centos7.9时发现没有网卡信息 , 只有ifcfg-lo网卡的信息 , 这个时候就证明没有网卡信息&#xff0c;或者网卡驱动不匹配(我这里是没有网卡)&#xff0c;所以我们要重新安装 , 安装步骤如下 : 二、安装步骤 1.查…

Android各版本号发布日期及详细更新内容

版本号发布日期版本名称API Level更新内容Android 1.02008年9月23日初始版本初始版本&#xff0c;提供基本的手机功能和应用程序。Android 1.52009年4月30日Cupcake添加了文本输入方法&#xff08;包括虚拟键盘&#xff09;和语音搜索。 改进了网络和蓝牙功能。Android 1.62009…

PHP 药店管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 药品管理系统 是一套完善的web设计系统,系统采用smarty框架进行开发设计&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 PHP 药店管理系统mysql数据库web结构apache计 下载地址…

开发一个简单的数据库路由进行分库分表

今天我们来看看一个简单的数据库路由组件要怎么开发出来&#xff0c;这篇文章分为几个步骤进行介绍&#xff0c;分别为&#xff1a; 什么是数据库路由 路由组件的作用为什么要自研组件需要用到什么技术 整体的业务流程主要代码 介绍 数据库路由的作用 使用数据库路由是在业…

超越想象的GPT医疗 20230723

7月份读完了这本书&#xff0c;趁着周末写下读书笔记吧 这本书 作者&#xff1a;【美】彼得.李 Peter Lee 【美】凯丽.戈德伯格CareyGoldberg 著 【美】伊萨克.科恩Isaac Kohane 芦义 译 在AI风起云涌时代&#xff0c;在这刚刚过去的新冠三年&#xff0c;“超越想象的GPT医…

产品解读|有了JMeter,为什么还需要MeterSphere?

提起JMeter&#xff0c;相信大部分的测试人员应该都很熟悉。JMeter因其小巧轻量、开源&#xff0c;加上支持多种协议的接口和性能测试&#xff0c;在测试领域拥有广泛的用户群体。一方面&#xff0c;测试人员会将其安装在个人的PC上&#xff0c;用以满足日常测试工作的需要&…

【SpringCloud Alibaba】(一)微服务介绍

此专栏内容皆来自于【冰河】的《SpringCloud Alibaba 实战》文档。 1. 专栏介绍 我们先来看看《SpringCloud Alibaba实战》专栏的整体结构吧&#xff0c;先上图 从上图&#xff0c;大家可以看到&#xff0c;专栏从整体上分为十个大的篇章&#xff0c;分别为 专栏设计、微服务…

Android源码中添加自己的Product

这里假设我们的公司名叫果冻&#xff08;Jelly&#xff09;&#xff0c;我们准备开发一款对标苹果 14 的手机&#xff0c;取名叫 大米14&#xff08;Rice14&#xff09;。 接下来我们在源码中添加我们自己的产品&#xff08;Product&#xff09; 在 device 目录下添加如下的目…

Mybatis基于注解与XML开发

文章目录 1 关于SpringBoot2 关于MyBatis2.1 MyBatis概述2.2 MyBatis核心思想2.3 MyBatis使用流程3 MyBatis配置SQL方式3.1 基于注解方式3.1.1 说明3.1.2 使用流程3.1.3 常用注解 3.2 基于XML方式3.2.1 相比注解优势3.2.2 使用流程3.2.3 常用标签 1 关于SpringBoot SpringBoot…

Java中List与数组之间的相互转换

一、List列表与对象数组 List列表中存储对象&#xff0c;如List<Integer>、List<String>、List<Person>&#xff0c;对象数组中同样存储相应的对象&#xff0c;如Integer[]、String[]、Person[]&#xff0c;对象数组与对象List的转换可通过如下方式实现&…

【Git】

学习来自于&#xff1a; 女朋友乱用Git&#xff0c;差点把我代码删了。。。 一些常用的Git 知识点整理 关于Git这一篇就够了 Git基本命令大全 30分钟精通Git&#xff0c;学不会来找我 Git 版本管理 | 莫烦PYTHON Git 代码版本管理教程 文章目录 【前言】集中式与分布式的…