480 lines
9.8 KiB
Markdown
480 lines
9.8 KiB
Markdown
---
|
||
title: Linux用户与权限
|
||
date: 2021-04-07 16:04:58
|
||
author: 文永达
|
||
top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/00E0F0ED-9F1C-407A-9AA6-545649D919F4.jpeg
|
||
tags: [Linux, Shell, 用户管理]
|
||
categories: [操作系统, Linux]
|
||
---
|
||
|
||
# Linux用户与权限
|
||
|
||
## 用户管理
|
||
|
||
### 查看用户
|
||
|
||
```shell
|
||
# 查看当前用户
|
||
who am i
|
||
|
||
# 查看当前登录用户数量
|
||
who --count
|
||
```
|
||
|
||
### 用户组管理
|
||
|
||
```shell
|
||
# 创建用户组
|
||
groupadd groupname
|
||
|
||
# 删除用户组
|
||
groupdel groupname
|
||
```
|
||
|
||
### 用户管理
|
||
|
||
```shell
|
||
# 创建用户并指定用户组
|
||
useradd username -g usergroup
|
||
|
||
# 设置用户密码
|
||
passwd username
|
||
|
||
# 切换用户
|
||
# 从 root 切换到其他用户不需要输入密码
|
||
# 从其他用户切换到 root 需要输入密码
|
||
su username
|
||
|
||
# 退出登录
|
||
exit
|
||
```
|
||
|
||
### 收回用户 Shell 权限
|
||
|
||
限制用户登录系统,禁止其使用交互式 Shell。
|
||
|
||
#### 设置禁止登录的 Shell
|
||
|
||
```shell
|
||
# 方法一:使用 /sbin/nologin(推荐)
|
||
usermod -s /sbin/nologin username
|
||
|
||
# 方法二:使用 /bin/false
|
||
usermod -s /bin/false username
|
||
```
|
||
|
||
#### 查看用户当前 Shell
|
||
|
||
```shell
|
||
grep username /etc/passwd
|
||
|
||
# 或
|
||
getent passwd username
|
||
```
|
||
|
||
输出示例:
|
||
|
||
```
|
||
username:x:1001:1001::/home/username:/sbin/nologin
|
||
```
|
||
|
||
#### 各 Shell 对比
|
||
|
||
| Shell | 效果 |
|
||
| --- | --- |
|
||
| `/bin/bash` | 正常登录,可执行命令 |
|
||
| `/sbin/nologin` | 拒绝登录,提示 `This account is currently not available` |
|
||
| `/bin/false` | 拒绝登录,无提示,退出码为 1 |
|
||
| `/usr/sbin/nologin` | 与 `/sbin/nologin` 相同(部分系统软链接) |
|
||
|
||
> **适用场景**:数据库用户、服务专用账户、FTP 账户等只需运行服务不需要登录系统的用户。
|
||
|
||
#### 恢复登录权限
|
||
|
||
```shell
|
||
usermod -s /bin/bash username
|
||
```
|
||
|
||
#### 批量收回
|
||
|
||
```shell
|
||
# 读取用户列表文件,批量设置
|
||
while read user; do
|
||
usermod -s /sbin/nologin "$user"
|
||
done < userlist.txt
|
||
```
|
||
|
||
---
|
||
|
||
## 权限管理
|
||
|
||
### Linux文件权限
|
||
|
||
Linux 文件有三种权限:
|
||
|
||
| 权限 | 说明 |
|
||
|-----|------|
|
||
| `r` | 可读 |
|
||
| `w` | 可写 |
|
||
| `x` | 可执行 |
|
||
|
||
### chmod 命令
|
||
|
||
修改文件或目录权限。
|
||
|
||
#### 基本语法
|
||
|
||
```shell
|
||
chmod [选项] 模式 文件
|
||
```
|
||
|
||
#### 符号模式
|
||
|
||
通过 `u`(所有者)、`g`(所属组)、`o`(其他用户)、`a`(所有人)配合 `+`、`-`、`=` 操作权限。
|
||
|
||
**操作符区别**:
|
||
|
||
| 操作符 | 作用 | 说明 |
|
||
|--------|------|------|
|
||
| `+` | 添加权限 | 在原有权限基础上增加,不影响已有权限 |
|
||
| `-` | 移除权限 | 从现有权限中移除,不影响未指定的权限 |
|
||
| `=` | 直接设置 | 覆盖为指定权限,其余位清零 |
|
||
|
||
```shell
|
||
# + 添加权限(累加,不影响其他位)
|
||
chmod u+x script.sh # 所有者添加执行权限
|
||
chmod a+r file.txt # 所有人添加读权限
|
||
chmod g+w,o+r file.txt # 组添加写,其他添加读
|
||
|
||
# - 移除权限(仅移除指定位,其余保留)
|
||
chmod o-w file.txt # 其他用户移除写权限
|
||
chmod g-x script.sh # 组移除执行权限
|
||
chmod a-w file.txt # 所有人移除写权限
|
||
|
||
# = 直接设置(覆盖,未指定的位全部清零)
|
||
chmod u=r file.txt # 所有者只有读权限(写和执行被清除)
|
||
chmod g=r file.txt # 组只有读权限
|
||
chmod o= file.txt # 其他用户无任何权限
|
||
chmod u=rwx,g=rx,o= file.txt # 精确控制每位权限
|
||
|
||
# + 重复添加已有权限不会报错,保持不变
|
||
chmod u+x file.txt # 如果已有执行权限,不变
|
||
chmod a+r file.txt # 如果所有人已有读权限,不变
|
||
```
|
||
|
||
> **注意**:`+` 是幂等操作,重复添加已有权限不会产生任何变化,也不会报错。`-` 同理,移除不存在的权限也不会报错。
|
||
|
||
**示例对比**:
|
||
|
||
```shell
|
||
# 假设文件当前权限为 rw-r--r--(644)
|
||
|
||
chmod u+x file.txt # 结果:rwxr--r--(654)只给所有者加了执行
|
||
chmod u-x file.txt # 结果:rw-r--r--(644)移除执行(本来就没有,不变)
|
||
chmod u=r file.txt # 结果:r--r--r--(444)所有者变成只读,写被清掉
|
||
chmod u=rw file.txt # 结果:rw-r--r--(644)所有者读写
|
||
chmod u=rwx,g=rx,o= file.txt # 结果:rwxr-x---(750)
|
||
```
|
||
|
||
#### 数字模式
|
||
|
||
用三位八进制数表示权限,每位对应 `u`、`g`、`o`。
|
||
|
||
| 数字 | 权限 | 说明 |
|
||
|-----|------|------|
|
||
| 7 | rwx | 读、写、执行 |
|
||
| 6 | rw- | 读、写 |
|
||
| 5 | r-x | 读、执行 |
|
||
| 4 | r-- | 只读 |
|
||
| 0 | --- | 无权限 |
|
||
|
||
```shell
|
||
# rwxr-xr-x(所有者全权限,组和其他用户读执行)
|
||
chmod 755 file.txt
|
||
|
||
# rw-r--r--(所有者读写,组和其他用户只读)
|
||
chmod 644 file.txt
|
||
|
||
# rw-rw----(所有者和组读写,其他用户无权限)
|
||
chmod 660 file.txt
|
||
|
||
# rwx------(仅所有者有全部权限)
|
||
chmod 700 file.txt
|
||
|
||
# rw-rw-rw-(所有人可读写)
|
||
chmod 666 file.txt
|
||
```
|
||
|
||
#### 常用权限参考
|
||
|
||
| 权限值 | 含义 | 适用场景 |
|
||
|--------|------|----------|
|
||
| `755` | rwxr-xr-x | 可执行脚本、程序,公开目录 |
|
||
| `644` | rw-r--r-- | 普通文件,所有人可读 |
|
||
| `700` | rwx------ | 私有目录,仅所有者可访问 |
|
||
| `600` | rw------- | 私有文件,如 SSH 密钥 |
|
||
| `640` | rw-r----- | 服务配置文件,组可读 |
|
||
| `777` | rwxrwxrwx | 所有人可读写执行(不推荐) |
|
||
|
||
#### 常用选项
|
||
|
||
```shell
|
||
# 递归修改目录及子目录下所有文件
|
||
chmod -R 755 /var/www/html
|
||
|
||
# 仅修改目录本身的权限
|
||
chmod 755 /var/www/html
|
||
|
||
# 修改符号链接的权限(不常用)
|
||
chmod -h 755 link_file
|
||
|
||
# 显示修改过程
|
||
chmod -v 755 file.txt
|
||
```
|
||
|
||
#### 设置特殊权限
|
||
|
||
```shell
|
||
# SUID(4):执行时以文件所有者身份运行
|
||
chmod 4755 /usr/bin/passwd
|
||
|
||
# SGID(2):执行时以文件所属组身份运行
|
||
chmod 2755 /shared_dir
|
||
|
||
# Sticky Bit(1):目录内文件只有所有者能删除
|
||
chmod 1777 /tmp
|
||
```
|
||
|
||
**特殊权限数字对照**:
|
||
|
||
| 数字 | 权限 | 说明 |
|
||
|------|------|------|
|
||
| 4 | SUID | 执行时以所有者身份运行 |
|
||
| 2 | SGID | 执行时以组身份运行 |
|
||
| 1 | Sticky | 仅文件所有者可删除目录内文件 |
|
||
|
||
```shell
|
||
# 同时设置特殊权限和普通权限
|
||
chmod 4755 file # SUID + rwxr-xr-x
|
||
chmod 2755 dir # SGID + rwxr-xr-x
|
||
chmod 1777 /tmp # Sticky + rwxrwxrwx
|
||
```
|
||
|
||
#### 通过八进制运算理解权限
|
||
|
||
```
|
||
用户(u) 组(g) 其他(o)
|
||
rwx r-x r--
|
||
4+2+1 4+0+1 4+0+0
|
||
7 5 4 = 754
|
||
```
|
||
|
||
---
|
||
|
||
### chown 命令
|
||
|
||
修改文件或目录的所有者和所属组。
|
||
|
||
#### 基本语法
|
||
|
||
```shell
|
||
chown [选项] 所有者[:所属组] 文件
|
||
```
|
||
|
||
#### 常用操作
|
||
|
||
```shell
|
||
# 修改文件所有者
|
||
chown user file.txt
|
||
|
||
# 修改文件所有者和所属组
|
||
chown user:group file.txt
|
||
|
||
# 修改文件所属组
|
||
chown :group file.txt
|
||
|
||
# 递归修改目录及子文件
|
||
chown -R user:group /var/www/html
|
||
|
||
# 仅修改所有者
|
||
chown -R user /var/www/html
|
||
|
||
# 仅修改所属组
|
||
chown -R :group /var/www/html
|
||
|
||
# 显示修改过程
|
||
chown -v user file.txt
|
||
```
|
||
|
||
#### 常用选项
|
||
|
||
| 选项 | 说明 |
|
||
|------|------|
|
||
| `-R` | 递归修改目录及子目录下所有文件 |
|
||
| `-v` | 显示修改过程 |
|
||
| `-c` | 仅显示更改的文件 |
|
||
| `-f` | 静默模式,忽略错误 |
|
||
| `-h` | 修改符号链接本身而非链接目标 |
|
||
|
||
#### 与 chgrp 的区别
|
||
|
||
```shell
|
||
# chown 可同时修改所有者和所属组
|
||
chown user:group file.txt
|
||
|
||
# chgrp 只能修改所属组
|
||
chgrp group file.txt
|
||
```
|
||
|
||
#### 实用场景
|
||
|
||
```shell
|
||
# 部署 Web 项目
|
||
chown -R nginx:nginx /var/www/html
|
||
|
||
# 将目录交给特定用户管理
|
||
chown -R user:user /home/user/projects
|
||
|
||
# 修改 SSH 密钥权限
|
||
chmod 600 ~/.ssh/id_rsa
|
||
chown root:root ~/.ssh
|
||
chmod 700 ~/.ssh
|
||
```
|
||
|
||
---
|
||
|
||
## sudo权限
|
||
|
||
### 开启sudo权限
|
||
|
||
#### 1. 添加sudoers文件写权限
|
||
|
||
```shell
|
||
chmod u+w /etc/sudoers
|
||
```
|
||
|
||
#### 2. 编辑sudoers文件
|
||
|
||
```shell
|
||
vim /etc/sudoers
|
||
```
|
||
|
||
找到 `root ALL=(ALL) ALL` 这行,在其下面添加:
|
||
|
||
```
|
||
username ALL=(ALL) ALL
|
||
```
|
||
|
||
#### 3. sudoers配置选项
|
||
|
||
```shell
|
||
# 允许用户执行sudo命令(需要输入密码)
|
||
username ALL=(ALL) ALL
|
||
|
||
# 允许用户组里的用户执行sudo命令(需要输入密码)
|
||
%usergroup ALL=(ALL) ALL
|
||
|
||
# 允许用户执行sudo命令,不需要输入密码
|
||
username ALL=(ALL) NOPASSWD: ALL
|
||
|
||
# 允许用户组里的用户执行sudo命令,不需要输入密码
|
||
%usergroup ALL=(ALL) NOPASSWD: ALL
|
||
```
|
||
|
||
#### 4. 撤销sudoers文件写权限
|
||
|
||
```shell
|
||
chmod u-w /etc/sudoers
|
||
```
|
||
|
||
---
|
||
|
||
## ACL权限
|
||
|
||
> ACL(访问控制列表)提供更细粒度的权限控制,允许为特定用户或组设置特定权限。
|
||
|
||
### 安装ACL工具
|
||
|
||
```shell
|
||
# Ubuntu/Debian
|
||
sudo apt install acl -y
|
||
|
||
# Fedora/AlmaLinux
|
||
sudo dnf install acl -y
|
||
```
|
||
|
||
### 设置ACL权限
|
||
|
||
```shell
|
||
# 为指定用户设置读写权限
|
||
sudo setfacl -m u:user:rwx /OLAP
|
||
```
|
||
|
||
### 验证ACL权限
|
||
|
||
```shell
|
||
getfacl /OLAP
|
||
```
|
||
|
||
**输出示例**:
|
||
|
||
```
|
||
getfacl: Removing leading '/' from absolute path names
|
||
# file: OLAP
|
||
# owner: user
|
||
# group: user
|
||
user::rwx
|
||
group::r-x
|
||
other::r-x
|
||
```
|
||
|
||
### 设置默认ACL权限
|
||
|
||
让新创建的文件和子目录自动继承特定权限:
|
||
|
||
```shell
|
||
sudo setfacl -dm u:user:rwx /OLAP
|
||
```
|
||
|
||
---
|
||
|
||
## 目录权限修改
|
||
|
||
### 查看目录权限
|
||
|
||
```shell
|
||
sudo ls -ld /OLAP
|
||
```
|
||
|
||
**输出示例**:
|
||
|
||
```
|
||
drwxr-xr-x 5 root root 4096 Aug 5 08:27 /OLAP
|
||
```
|
||
|
||
### 修改目录权限
|
||
|
||
```shell
|
||
# 设置权限为775(rwxrwxr-x)
|
||
sudo chmod 775 /OLAP
|
||
```
|
||
|
||
这样目录的所有者和所属组的用户都可以读写,其他用户只有读取和执行权限。
|
||
|
||
### 将用户加入目录所属组
|
||
|
||
```shell
|
||
# 将用户加入root组(不推荐,root组权限过高)
|
||
sudo usermod -aG root user
|
||
```
|
||
|
||
重新登录或重启系统以使组变更生效。
|
||
|
||
### 更改目录所有者
|
||
|
||
```shell
|
||
# 将目录所有者更改为指定用户
|
||
sudo chown user:user /OLAP
|
||
```
|
||
|
||
这样用户将拥有对目录的完全控制权。 |