一、背景说明
在 linux 服务器自动化运维、初始化脚本或容器环境中,经常需要判断某个系统用户是否存在:
- 如果存在:直接使用
- 如果不存在:自动创建用户
本文介绍如何使用 python 的 subprocess 模块,调用系统命令 id 和 adduser,实现 检测 unix 用户是否存在,不存在则创建 的功能。
适用于:
- ubuntu / debian 系统
- python 运维脚本
- 自动化部署场景
二、实现思路
整体逻辑非常简单:
1.使用 id username
- 如果用户存在,命令返回 0
- 如果用户不存在,命令返回非 0
2.通过 subprocess.run(..., check=true):命令失败会抛出 calledprocesserror
3.捕获异常后,调用 adduser 创建用户
流程图如下:
检测用户是否存在
│
├── 存在 → 输出 user exists
│
└── 不存在 → 创建用户 → 输出创建成功
三、完整代码示例
import subprocess
# 替换为你要检测/创建的用户名
unix_username = "username"
try:
# 1. 检测用户是否存在
subprocess.run(
["id", unix_username],
check=true,
stdout=subprocess.pipe,
stderr=subprocess.pipe
)
print("user exists")
except subprocess.calledprocesserror:
try:
# 2. 用户不存在,创建用户
subprocess.run(
["adduser", "-m", "-s", "/bin/bash", unix_username],
check=true
)
print(f"user {unix_username} created successfully.")
except subprocess.calledprocesserror as e:
print(f"error creating user: {e}")
print("user does not exist")
四、代码说明
id username
id username
- 用户存在:返回 uid、gid 等信息
- 用户不存在:返回错误码(非 0)
python 中用来判断用户是否存在非常合适。
subprocess.run参数说明
subprocess.run(
["id", unix_username],
check=true,
stdout=subprocess.pipe,
stderr=subprocess.pipe
)
关键参数说明:
| 参数 | 作用 |
|---|---|
| check=true | 命令失败时抛出异常 |
| stdout=subprocess.pipe | 捕获标准输出 |
| stderr=subprocess.pipe | 捕获错误输出 |
创建用户命令
["adduser", "-m", "-s", "/bin/bash", unix_username]
参数含义:
| 参数 | 说明 |
|---|---|
| -m | 创建 home 目录 |
| -s /bin/bash | 设置默认 shell |
| username | 用户名 |
五、运行注意事项(很重要)
必须使用 root 权限
adduser 需要 root 权限,否则会失败:
sudo python3 create_user.py
或者脚本本身运行在 root 用户下。
适用系统
- ubuntu / debian(使用
adduser) - centos / rhel(需改为
useradd)
centos 示例:
["useradd", "-m", "-s", "/bin/bash", unix_username]
避免交互式创建(推荐)
adduser 默认可能会进入交互模式,生产环境建议使用非交互方式:
adduser --disabled-password --gecos "" username
对应 python:
["adduser", "--disabled-password", "--gecos", "", unix_username]
六、常见错误
permission denied
原因:没有 root 权限
解决:
sudo python3 script.py
adduser: command not found
原因:系统是 centos / alpine
解决:改用 useradd
到此这篇关于python使用subprocess模块检测linux用户是否存在的文章就介绍到这了,更多相关python subprocess检测linux用户是否存在内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论