Linux用户与权限管理详解

文章目录

一、用户的管理

在 Linux 中,用户分为以下几种类型

  • 超级用户(root):拥有系统的最高权限,可以执行所有操作
  • 普通用户:权限受到限制,只能访问被授权的资源
  • 系统用户:系统进程运行时所使用的用户(如 nobodydaemon),通常不能登录系统

1、添加用户

useradd是Linux系统中用于创建新用户的基本命令。

基本语法

bash 复制代码
useradd [options] username

常用选项

  • -d:指定用户的主目录(默认主目录是 /home/用户名
  • -g:指定用户所属的初始组(默认组名是用户名
  • -G:为用户分配附加的组
  • -u:指定用户 ID(默认系统会自动分配)

常用示例

  1. 添加用户testuser

    bash 复制代码
    useradd testuser
  2. 添加用户zhangsan并设置该用户的主目录

    bash 复制代码
    useradd -d /usr/zhangsan zhangsan
  3. 添加lisi用户,该用户的主目录/usr/lisi,所属主组dev,附加组test

    bash 复制代码
    useradd -d /usr/lisi -g dev -G test lisi

2、设置用户密码

创建用户后,需要为其设置密码,否则用户无法登录。

基本语法

bash 复制代码
passwd username

常用示例

  • 为用户testuser设置密码()

    bash 复制代码
    passwd testuser
  • 系统会提示输入两次密码以进行确认

3、切换用户

**  su是switch user(切换用户)的缩写,主要用于在终端中切换到另一个用户(通常是root)执行操作。**

基本语法

bash 复制代码
su [username]

常用示例

  1. 切换到普通用户testuser

    bash 复制代码
    su testuser

    输入testuser的密码后,会切换到该用户

  2. 切换到root用户(如果你是普通用户)

    bash 复制代码
    su -	# 切换到 root 用户,并加载 root 的完整环境

    或者直接:

    bash 复制代码
    su
    # 或
    su root		# 切换到 root 用户,但不加载目标用户的完整环境

    输入root用户的密码后,切换到超级用户,前者加载root完整环境,后者保留当前用户环境

  3. 切换用户并加载其登录环境(推荐

    bash 复制代码
    su - username

    ---login参数,会加载目标用户的完整登录环境(包括环境变量、工作目录等)

  4. 退出当前用户

    bash 复制代码
    exit

    或按快捷键:

    bash 复制代码
    Ctrl + D

    切换到其他用户后,可以使用以下命令返回到上一个用户

快速验证当前用户

  1. 使用whoami查看当前用户名
  2. 使用id查看当前用户信息

4、修改用户

修改用户就是对用户名,用户主目录,用户组等进行修改。

基本语法

bash 复制代码
usermod [options] username

常用选项

  • -l:指定新的用户名
  • -d:指定新用户的主目录
  • -g:指定新用户属于哪个组(主组)
  • -G:指定新用户分配附加的组

常用示例

  1. 修改用户名(将zhangsan修改为lis)

    bash 复制代码
    usermod -l lis zhangsan  
  2. 修改主目录

    bash 复制代码
    # -m 选项很重要,当有了这个选项之后,目录不存在时会新建该目录。
    usermod -d /usr/zhangsan2 -m zhangsan
  3. 修改所属组

    bash 复制代码
    usermod -g dev1 zhangsan
  4. 锁定用户

    bash 复制代码
    usermod -L zhangsan
  5. 解锁用户

    bash 复制代码
    usermod -U zhangsan

5、删除用户

  • 删除用户并连同主目录一块删除

    bash 复制代码
    userdel -r zhangsan
  • 默认情况下,专属用户组会被自动删除,非专属组不会删除

6、sudo命令

**  sudo允许普通用户以超级用户(root)或其他用户的身份执行命令。它是提升权限的一种安全方式,避免直接使用root登录。**

基本语法

bash 复制代码
sudo [选项] [命令]

常用选项

选项 作用 示例
-i 模拟登录目标用户(默认 root),加载完整的登录环境 sudo -i
-u <user> 以指定用户(<user>)的身份运行命令。默认为 root sudo -u www-data whoami
-k 立即失效当前用户的 sudo 缓存,要求下次使用 sudo 时重新输入密码 sudo -k
-l 列出当前用户可以使用的 sudo 权限 sudo -l
-v 验证用户的 sudo 权限,但不运行任何命令(重新输入密码时可用) sudo -v
--edit-e 以编辑模式打开文件(以 sudo 权限) sudo -e /etc/fstab
  • 默认情况下,sudo 在输入密码后会缓存一段时间(通常是15分钟
  • 在缓存时间内,重复执行sudo命令无需再次输入密码

常用示例

  1. sudo权限运行单个命令

    bash 复制代码
    sudo apt update   # 更新系统软件包信息
    • 特点:临时获得root权限,运行结束后权限释放
  2. 切换到root用户

    bash 复制代码
    sudo -i
    • 作用:切换到root,加载root用户的完整登录环境(类似su -
    • 适用场景:需要长时间以root身份运行多个命令
  3. 以指定用户运行命令

    bash 复制代码
    sudo -u www-data whoami
    • 作用:以www-data用户的身份执行命令

sudo配置文件(/etc/sudoers

  • sudoers 文件是 sudo 权限的配置文件,定义了哪些用户或用户组可以执行哪些命令

常见规则示例

bash 复制代码
# 允许用户 `user1` 以 `root` 权限执行任何命令
user1 ALL=(ALL:ALL) ALL

# 允许用户 `user2` 在不输入密码的情况下运行所有命令
user2 ALL=(ALL:ALL) NOPASSWD: ALL

# 允许用户 `user3` 只运行特定命令
user3 ALL=(ALL:ALL) /usr/bin/systemctl restart apache2

# 允许用户组 `admin` 执行所有命令
%admin ALL=(ALL:ALL) ALL

sudosu 的区别

特点 sudo su
作用 提升权限执行单个命令或切换到root 切换到另一个用户(默认是root)
密码使用 使用当前用户的sudo密码 使用目标用户的密码(如root密码)
权限控制 通过/etc/sudoers进行细粒度控制 需要知道目标用户密码,没有细粒度权限控制
安全性 更安全(避免暴露root密码,且支持日志审计 较不安全(需要启用并暴露root密码)
适用场景 执行单次提权命令、管理系统 长期以root用户身份工作

二、用户组的管理

在Linux系统中,用户组管理是用户管理的重要部分。通过对用户组的管理,可以方便地设置用户权限,组织用户,以及控制对资源的访问。

  • 用户组的添加、修改和删除实际上就是对/etc/group文件的更新
  • 使用root账户查看当前系统的用户组有哪些
    • lighthouse:组名,组的的名称
    • x:密码占位符,通常为 x,实际密码存储在/etc/gshadow文件中
    • 1001:组的ID
    • lighthouse:组内用户列表,属于该组的用户
  • 查看当前登录的账户属于哪一组
  • 查看某个用户属于哪一组

1、添加用户组

使用groupadd命令可以创建一个新的用户组。

基本语法

bash 复制代码
groupadd [选项] 用户组名

常用示例

  1. 创建一个名为developers的用户组

    bash 复制代码
    groupadd developers
  2. 指定组ID创建用户组

    bash 复制代码
    groupadd -g 1001 developers

2、修改用户组

使用groupmod命令修改组的信息,包括组名和组ID。

常用示例

  1. 将组developers的名字改为devteam

    bash 复制代码
    groupmod -n devteam developers
    • -n:指定新的组名
  2. 将组developers的GID修改为2000

    bash 复制代码
    groupmod -g 2000 developers
  3. 将用户john的主组修改为developers

    bash 复制代码
    usermod -g developers john
  4. 将用户john添加到admins附加组

    bash 复制代码
    usermod -aG admins john
    • -a:追加用户到附加组(不加 -a 会覆盖用户当前的附加组)
    • -G:指定附加组列表

3、删除用户组

  • 删除一个名为developers的用户组

    bash 复制代码
    groupdel developers
  • 如果系统中有文件或目录属于该组,删除组后文件可能会显示为无效的组ID

三、文件权限

1、查看文件属性

  • 使用命令 ls -lll可以查看文件的详细属性信息

示例

bash 复制代码
$ ls -l
-rw-r--r--  1 user group  1234 Dec 22 12:00 example.txt

输出的每一部分的含义如下:

字段 示例值 含义
文件类型和权限 -rw-r--r-- 文件类型和权限(文件、目录、符号链接等)
硬链接数量 1 指向该文件的硬链接数量
所有者(用户) user 文件所属用户
所属组 group 文件所属组
文件大小 1234 文件大小,以字节为单位
修改时间 Dec 22 12:00 文件的最后修改时间
文件名 example.txt 文件的名称

2、文件类型

  • 文件类型由第一个字符决定
字符 文件类型 说明
- 普通文件 常见的文本文件、二进制文件等
d 目录 文件夹
l 符号链接 指向另一个文件的快捷方式
b 块设备文件 存储设备(如硬盘、光盘)
c 字符设备文件 终端设备等
s 套接字文件 用于进程间通信
p 命名管道(FIFO) 用于进程间通信的特殊文件

3、文件权限

  • 文件权限由rwx组合表示,分为三组
    1. 所有者(User):文件的拥有者
    2. 所属组(Group):文件所属的用户组
    3. 其他用户(Other):系统中所有其他用户

权限表示

字符 权限 说明
r 读取(read) 查看文件内容或列出目录内容
w 写入(write) 修改文件内容或在目录中创建/删除文件
x 执行(execute) 运行文件(脚本或程序)或进入目录
- 无权限 无法执行对应操作

权限结构

  • 权限由10个字符组成
    • 第 1 个字符:文件类型(如 -d 等)
    • 后 9 个字符:文件权限,分为三组(所有者、组、其他用户)
示例 解释
-rw-r--r-- 普通文件,所有者可读写,组用户和其他用户只读
drwxr-xr-x 目录,所有者可读写执行,组用户和其他用户可读执行
-rwx------ 普通文件,仅所有者可读写执行

4、修改文件权限

  • 权限可以通过chmod命令修改

语法

bash 复制代码
chmod [模式] 文件名

方式 1:使用数字表示权限

  • 每种权限用一个数字表示
权限 数字
r 4
w 2
x 1
- 0

示例

  • chmod 755 file
    • 所有者:rwx(4+2+1=7)
    • 组用户:r-x(4+1=5)
    • 其他用户:r-x(4+1=5)

方式 2:使用符号表示权限

  • 符号表示法
    • u:所有者
    • g:组用户
    • o:其他用户
    • a:所有用户
    • +:增加权限
    • -:移除权限
    • =:设置权限

示例

bash 复制代码
chmod u+x file    # 给所有者增加执行权限
chmod g-w, o-w file    # 删除同组人员和其他组人员写的权限
chmod o=r file    # 将其他用户权限设置为只读

5、修改文件所有者和所属组

  • 使用chownchgrp命令修改文件所有者和所属组

常用示例

  1. 修改所有者

    bash 复制代码
    chown 新所有者 文件名

    示例:

    bash 复制代码
    chown user2 file
  2. 修改所属组

    bash 复制代码
    chgrp 新组 文件名

    示例:

    bash 复制代码
    chgrp developers file
  3. 同时修改所有者和组

    bash 复制代码
    chown 新所有者:新组 文件名

    示例:

    bash 复制代码
    chown user2:developers file
相关推荐
火龙kess25 分钟前
使用FreeNAS软件部署ISCSI的SAN架构存储(IP-SAN)练习题
linux·运维·服务器·网络·windows·tcp/ip·架构
huapiaoy38 分钟前
JavaSE---String(含一些源码)
java·linux·前端
云计算DevOps-韩老师1 小时前
【网络云计算】2024第52周-每日【2024/12/23】小测-理论&实操-解析
linux·运维·服务器·开发语言·网络·云计算·perl
☆凡尘清心☆1 小时前
CentOS-stream-9安装ansible
linux·centos·ansible
码农君莫笑2 小时前
Blazor项目中使用EF读写 SQLite 数据库
linux·数据库·sqlite·c#·.netcore·人机交互·visual studio
张声录12 小时前
【ETCD】【实操篇(三)】【ETCDCTL】如何向集群中写入数据
数据库·chrome·etcd
dessler2 小时前
Docker-如何启动docker
运维·docker·云原生·容器·eureka
zhy295632 小时前
【DOCKER】基于DOCKER的服务之DUFS
运维·docker·容器·dufs
无为之士2 小时前
Linux自动备份Mysql数据库
linux·数据库·mysql
秋名山小桃子2 小时前
Kunlun 2280服务器(ARM)Raid卡磁盘盘符漂移问题解决
运维·服务器