OpenWrt通过命令或Python添加用户方法及密码文件异常求助
在OpenWrt中正确添加用户(命令行+Python方法)
我明白你在OpenWrt里添加用户时遇到的困惑——手动编辑/etc/passwd后用passwd设置密码,结果加密密码跑到passwd里而不是shadow,这和Ubuntu的行为完全不一样对吧?这其实是因为OpenWrt基于BusyBox的用户管理工具和常规发行版逻辑有差异,再加上可能系统没正确启用shadow文件支持,才导致了这个问题。
先搞懂核心问题:为什么密码会写到/etc/passwd?
在常规Linux发行版(比如Ubuntu)中,/etc/passwd里的x表示密码存储在/etc/shadow,但OpenWrt如果没配置好shadow支持,BusyBox的passwd工具会默认把加密密码直接写入/etc/passwd。要解决这个,第一步要确保系统启用shadow:
- 检查
/etc/nsswitch.conf文件,确认存在以下两行:
如果没有,手动添加并保存。passwd: files shadow group: files shadow
方法一:用命令行正确添加用户
OpenWrt默认没有useradd,但有BusyBox自带的adduser工具,这是最稳妥的方式:
直接执行添加命令:
adduser testuser按照提示输入密码、确认密码,工具会自动完成以下操作:
- 在
/etc/passwd添加带x的用户条目 - 在
/etc/shadow添加加密密码条目 - 创建用户主目录并设置权限
- 在
如果一定要手动操作(不推荐):
- 先在
/etc/passwd末尾添加一行(注意x的位置):testuser:x:1000:1000::/home/testuser:/bin/ash - 创建用户主目录并设置权限:
mkdir -p /home/testuser chown testuser:testuser /home/testuser - 在
/etc/shadow末尾添加占位条目:testuser:*:18999:0:99999:7::: - 最后设置密码,此时会写入
/etc/shadow:passwd testuser
- 先在
方法二:用Python脚本添加用户
如果需要自动化添加,用Python可以实现完整流程,注意必须以root权限运行:
import crypt import os # 配置用户信息 username = "testuser" password = "your_secure_password_here" uid = 1000 # 确保这个UID未被占用 gid = 1000 # 通常和UID一致 home_dir = f"/home/{username}" shell = "/bin/ash" # 生成符合OpenWrt要求的SHA-512加密密码 encrypted_password = crypt.crypt(password, crypt.mksalt(crypt.METHOD_SHA512)) # 写入/etc/passwd with open("/etc/passwd", "a") as passwd_file: passwd_entry = f"{username}:x:{uid}:{gid}::{home_dir}:{shell}\n" passwd_file.write(passwd_entry) # 写入/etc/shadow with open("/etc/shadow", "a") as shadow_file: # 格式说明:用户名:加密密码:最后修改时间:最小间隔:最大间隔:警告天数:过期天数:失效天数:保留 shadow_entry = f"{username}:{encrypted_password}:0:0:99999:7:::\n" shadow_file.write(shadow_entry) # 创建并配置用户主目录 os.makedirs(home_dir, exist_ok=True) os.chown(home_dir, uid, gid)
脚本注意事项:
- 替换
your_secure_password_here为实际密码 - 确保
uid和gid在系统中未被其他用户占用(可以用cat /etc/passwd查看已用UID) - 执行脚本前确认
/etc/nsswitch.conf已配置shadow支持
内容的提问来源于stack exchange,提问作者Rafsan Jany




