外观
批量导入用户
家里有十几口人,或者团队里要给几十个同事开账号,在界面里一个个点太慢,还容易漏。读完这一篇,你能一次导入一批用户组和用户,固定每个人的 UID,并且用比较安全的方式发放初始密码。
开始之前
- 先读 用户与用户组,了解 OMV 里用户、
users组和权限的关系。 - 界面里新建单个用户的表单没有 UID 字段,系统会自动分配。需要固定 UID 时(重装系统后要恢复、NFS 要对齐、容器要用 PUID),只能用导入功能。
- 命令在 OMV 的 shell(root 身份)里执行。
给用户的组要有节制
sudo 组的成员可以用 sudo 提权成 root;openmediavault-admin 组的成员是 Web 管理员,能改全部设置;_ssh 组的成员可以通过 SSH 登录。批量导入时,只给业务需要的组,不要把这三个组随手加给所有人。
导入格式
用户
入口是 用户 → 用户(Users → Users),工具栏上有一个创建 | 导入的按钮,点开选导入(Import)。文本框里预置了一行注释,说明了字段顺序。每行一个用户,一共 8 个字段,用英文分号分隔:
text
# <用户名>;<UID>;<标签>;<邮箱>;<密码>;<shell>;<组名,组名,...>;<是否禁止修改账户>| 字段 | 说明 |
|---|---|
| 用户名 | 必填。界面的校验规则是字母、数字、下划线、点和连字符,建议全部用小写 |
| UID | 可留空,留空由系统分配;填了就必须是还没被占用的数字 |
| 标签 | 对应用户列表里的标签(Tags)列,可留空,不能含分号 |
| 邮箱 | 可留空,不能含分号 |
| 密码 | 明文,不能含分号和换行 |
| shell | 登录 shell,留空时用 /bin/sh |
| 组名 | 用英文逗号分隔的额外用户组,可留空。这些组必须已经存在 |
| 是否禁止修改账户 | 必填,取值 true、1、yes、y、on、false、0、no、n、off,不区分大小写 |
以 # 开头的行和空行会被忽略。所有用户的主组都是 users(GID 100),组名字段是在主组之外额外加入的组。
官方源码里的注释和实际格式不一致
OMV 源码里 importUsers 的注释写的是 7 个字段的旧格式,没有 shell 这一项,但实际解析用的是 8 个字段,界面预置的注释行也是 8 个字段。照界面里的为准,少一个字段会报 Invalid line。
用户组
用户组放在前面先导入。入口是 用户 → 用户组(Users → Groups),同样在创建 | 导入的按钮里选导入,每行一个组,3 个字段:
text
# <组名>;<GID>;<标签>GID 可以留空,由系统分配。
一个完整的例子
先导入用户组:
text
family;2000;家庭成员
media;2001;影音库只读再导入用户,密码用占位符表示:
text
alice;2001;;[email protected];<初始密码>;/bin/sh;family,media;false
bob;2002;;;<初始密码>;/bin/sh;family;false
guest1;2003;访客;;<初始密码>;/bin/sh;media;true建议给手动指定的 UID 和 GID 划一个固定的区间,比如从 2000 开始,避开系统自动分配的 1000 起的那一段,并把对应关系记在文档里,以后重装和迁移要用,见 系统盘坏了:重装并接回数据盘。
导入时发生什么
按源码里的逻辑:
- 先整体校验。 逐行检查格式、用户名是否已经存在、UID 是否已被占用。任何一行有问题,整批都不会创建。
- 再逐个创建。 通过校验后,一个一个创建用户。这时才会检查组是否存在,所以用户组必须先建好,否则前面的用户已经建好、某一个因为组不存在而失败,导入就是只做了一半。
- 在后台运行。 界面会弹出一个任务对话框显示进度。
创建用户时,OMV 同时会为这个用户建立 SMB 账号,密码和 Linux 密码一致。
初始密码怎么发放
- 每个人一个随机密码,不要用统一的初始密码。下面的脚本里有生成方法。
- 导入文本里的密码是明文。 用 HTTPS 访问 Web 界面(见 Web 界面安全:HTTPS、端口与自动注销),导入完成后清掉剪贴板和临时文件,不要把带密码的文件留在 NAS 上或发到聊天记录里。
- 让用户自己改。 用户登录 Web 界面后,在
账户 → 密码(Account → Password)里修改,Linux 和 SMB 密码会同时更新。给用户勾选了不允许修改账户的话,他们就改不了,只适合服务账号和孩子的账号。 - 改密码一律走 OMV。 按 OMV 8.5 源码,SMB 密码只在通过 OMV 创建或修改用户时同步。在 shell 里用
passwd改 Linux 密码,不会更新 SMB 密码,结果是 SSH 能登录而 SMB 登录失败。
用脚本批量生成
下面的脚本把一份简单的名单变成导入文本,并给每个人生成随机密码。名单 names.txt 每行 4 个字段:用户名、UID、邮箱、组名:
text
alice;2001;[email protected];family,media
bob;2002;;family脚本在 OMV 的 shell(或你自己的电脑)上运行,示例没有在实机上验证,请先在测试机上试:
bash
#!/bin/bash
set -euo pipefail
umask 077 # 生成的文件只有当前用户能读
out=users-import.csv
: > "$out"
while IFS=';' read -r name uid email groups; do
[ -n "$name" ] || continue
pw=$(openssl rand -base64 18 | tr -d '/+=' | head -c 16)
printf '%s;%s;;%s;%s;/bin/sh;%s;false\n' "$name" "$uid" "$email" "$pw" "$groups" >> "$out"
done < names.txt生成的 users-import.csv 里就有明文密码。复制内容粘贴到界面的导入框里,也可以用 RPC 直接导入:
sh
omv-rpc UserMgmt importUsers "$(jq -Rs '{csv: .}' users-import.csv)"importUsers 是后台任务,调用后立即返回一个状态文件名,等待它结束的方法见 用 omv-rpc 写自动化脚本。用 RPC 导入时,整份 JSON(含密码)会出现在命令行参数里,同一台机器上的其他用户在这段时间能通过进程列表看到,所以只在没有其他本地用户的 NAS 上这样做。导入完成后删除 users-import.csv。
用户组也有对应的 UserMgmt importGroups,参数形式相同,字段是 <组名>;<GID>;<标签>。
检查结果
回到 用户 → 用户,确认新用户出现在列表里,UID、GID 和用户组符合预期。再用只读命令核对:
sh
id alice # 应显示 uid=2001,gid=100(users),groups 里包含额外的组
getent passwd alice
pdbedit -L | grep alice # SMB 账号也已经建立最后用一个新用户在客户端上访问一次 SMB 共享,确认初始密码可用。如果这个用户没有加入 _ssh 组,就不能 SSH 登录,这是预期行为。
常见问题
报 Invalid line: ...。 字段数量或格式不对。最常见的原因是少了 shell 字段(旧的 7 字段格式),或者最后一个字段不是 true、false 这类布尔值。
用户已经存在或者 UID 已被占用。 整批导入不会开始,先去掉已有的用户,或者换一个 UID。可以用 getent passwd 看现有的账户。
导入到一半失败。 多半是组名拼错或组不存在。用户组要先导入,已创建的用户要在界面里手动删除,或者把剩下的补上。
密码里想用分号。 不行,分号是字段分隔符。生成密码时避开它,上面的脚本用 Base64 字符,不包含分号。
SMB 登录提示密码错误,但 Web 界面能登录。 检查这个密码是不是在 OMV 里设置的,而不是用 passwd。在 OMV 里重新设置一次密码就能同步。