You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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工具,这是最稳妥的方式:

  1. 直接执行添加命令:

    adduser testuser
    

    按照提示输入密码、确认密码,工具会自动完成以下操作:

    • /etc/passwd添加带x的用户条目
    • /etc/shadow添加加密密码条目
    • 创建用户主目录并设置权限
  2. 如果一定要手动操作(不推荐):

    • 先在/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为实际密码
  • 确保uidgid在系统中未被其他用户占用(可以用cat /etc/passwd查看已用UID)
  • 执行脚本前确认/etc/nsswitch.conf已配置shadow支持

内容的提问来源于stack exchange,提问作者Rafsan Jany

火山引擎 最新活动