1. 账户与组管理基础概念
在Linux系统中,账户和组管理是系统管理员日常工作中最基础也最重要的任务之一。每个用户账户都对应着一个唯一的用户ID(UID),而组则是用户集合的逻辑容器,每个组也有唯一的组ID(GID)。这种设计不仅实现了权限隔离,也为协作共享提供了便利。
用户账户主要分为三类:
- 超级用户(root):UID为0,拥有系统最高权限
- 系统用户:UID通常为1-999,用于运行系统服务
- 普通用户:UID从1000开始,供日常使用者
组管理同样遵循类似分类:
- 主组(Primary Group):用户创建文件时默认所属的组
- 附属组(Supplementary Groups):用户可属于多个附加组
重要提示:在配置用户权限时,遵循最小权限原则,避免过度授权。特别是生产环境中,root权限的使用要格外谨慎。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 用户账户管理实操指南
2.1 用户账户创建与配置
创建新用户的基本命令是useradd,但不同Linux发行版的默认行为可能有所差异。以下是更可靠的创建方式:
bash复制sudo useradd -m -s /bin/bash -c "User Description" username
参数说明:
-m:创建用户主目录(/home/username)-s:指定登录shell-c:添加用户描述信息
创建后应立即设置密码:
bash复制sudo passwd username
实际工作中,我建议使用以下增强配置:
bash复制sudo useradd -m -s /bin/bash -u 1500 -g developers -G docker,git -e 2023-12-31 username
这里添加了:
- 自定义UID(-u)
- 指定主组(-g)
- 添加附属组(-G)
- 设置账户过期日期(-e)
2.2 用户属性修改与删除
修改用户属性使用usermod命令。常见场景包括:
- 修改登录名:
sudo usermod -l newname oldname - 锁定账户:
sudo usermod -L username(比直接删除更安全) - 修改主目录:
sudo usermod -d /new/home -m username
删除用户时,推荐使用:
bash复制sudo userdel -r username
-r参数会同时删除用户主目录和邮件池。但在生产环境中,建议先备份用户数据再执行删除。
3. 组管理深度解析
3.1 组创建与管理
创建新组的基本命令:
bash复制sudo groupadd -g 2000 developers
其中-g指定GID,若不指定则自动分配。
将用户添加到组有两种方式:
- 创建用户时指定:
sudo useradd -G group1,group2 username - 修改现有用户:
sudo usermod -aG groupname username
特别注意:使用
usermod时一定要加-a参数(append),否则用户会被移出所有其他附属组。
查看用户所属组:
bash复制groups username
id username # 更详细的UID/GID信息
3.2 组权限实战案例
假设我们需要设置一个共享目录,允许developers组的成员共同编辑:
bash复制sudo mkdir /opt/project
sudo chown :developers /opt/project
sudo chmod 2775 /opt/project
关键点:
chown :group修改所属组2775中的2设置SGID位,保证新建文件继承父目录的组775提供组读写执行权限
4. 账户配置文件详解
4.1 /etc/passwd文件结构
每行格式为:
code复制username:x:UID:GID:description:homedir:shell
典型示例:
code复制alice:x:1001:1001:Alice Chen:/home/alice:/bin/bash
各字段含义:
x:密码占位符(实际密码在/etc/shadow)- UID/GID:用户和主组ID
- description:注释字段,常用于全名
- homedir:用户主目录路径
- shell:登录shell
4.2 /etc/shadow安全机制
更安全的密码存储格式:
code复制username:$6$salt$hashed:lastchg:min:max:warn:inactive:expire:reserved
密码哈希类型:
$1$:MD5(不安全)$5$:SHA-256$6$:SHA-512(推荐)
使用chage命令管理密码策略:
bash复制sudo chage -M 90 -m 7 -W 14 username
设置密码最长90天,最短7天,到期前14天警告。
5. 查找命令大全
5.1 find命令高级用法
基本语法:
bash复制find [path] [options] [expression]
实用案例集合:
- 按名称查找(区分大小写):
bash复制find /var/log -name "*.log"
- 按类型查找:
bash复制find ~ -type f -size +10M # 大于10MB的文件
find /tmp -type d -empty # 空目录
- 按时间查找:
bash复制find /etc -mtime -7 # 7天内修改过的
find /backup -mtime +30 # 30天前修改过的
- 结合执行命令:
bash复制find . -name "*.tmp" -exec rm {} \; # 删除所有tmp文件
find /photos -size +5M -exec ls -lh {} \; # 列出大文件详情
5.2 locate与updatedb
locate比find更快,因为它查询预建的数据库:
bash复制locate nginx.conf
更新数据库:
bash复制sudo updatedb
注意:
locate不实时反映文件系统变化,新建文件需要先updatedb
5.3 which/whereis/whatis
-
which:显示命令的完整路径bash复制which python -
whereis:定位二进制、源码和man页bash复制
whereis java -
whatis:显示命令的简要说明bash复制whatis ls
6. 高级组合技巧
6.1 管道配合查找
查找并统计日志中的错误:
bash复制find /var/log -name "*.log" -exec grep -l "ERROR" {} \; | wc -l
查找并打包旧项目:
bash复制find /projects -mtime +365 -type f -print0 | tar -czvf archive.tar.gz --null -T -
6.2 xargs高效处理
删除一周未访问的临时文件:
bash复制find /tmp -atime +7 -print0 | xargs -0 rm -f
批量修改权限:
bash复制find . -name "*.sh" -print0 | xargs -0 chmod 755
6.3 正则表达式搜索
复杂模式匹配:
bash复制find . -regex ".*/202[0-9]-[01][0-9]-[0-3][0-9]\.log"
排除特定目录:
bash复制find /data -path "/data/backups" -prune -o -name "*.dat" -print
7. 安全审计与监控
7.1 账户安全检查
查找无密码账户:
bash复制sudo awk -F: '($2 == "") {print $1}' /etc/shadow
检查sudo权限用户:
bash复制sudo grep -Po '^sudo.+:\K.*$' /etc/group
7.2 文件系统监控
查找SUID/SGID文件:
bash复制find / -type f \( -perm -4000 -o -perm -2000 \) -ls
查找所有人可写文件:
bash复制find / -perm -o+w -type f ! -path "/proc/*" -ls
7.3 登录审计
查看最近登录:
bash复制last -n 10
检查失败登录尝试:
bash复制sudo grep "Failed password" /var/log/auth.log
8. 实用脚本示例
8.1 批量创建用户
bash复制#!/bin/bash
# Usage: ./addusers userlist.txt
while IFS=, read -r username fullname
do
sudo useradd -m -c "$fullname" -s /bin/bash "$username"
echo "$username:default123" | sudo chpasswd
sudo chage -d 0 "$username" # 强制首次登录修改密码
done < "$1"
8.2 磁盘空间分析
bash复制#!/bin/bash
# Find top 10 largest directories
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -n 11
8.3 自动清理临时文件
bash复制#!/bin/bash
# Clean files older than 30 days in /tmp
find /tmp -type f -mtime +30 -delete
find /tmp -type d -empty -delete
