Redis ACL LIST 怎样导出用户权限并比较两台实例差异
来源:17golang原创
时间:2026-11-11 04:50:18 374浏览 收藏
迁移 Redis 或做权限审计时,我更愿意先把两台实例的有效 ACL 规则导出成文本,再讨论差异。这个动作只读取当前权限,不会修改用户;核心命令是 ACL LIST,它返回按 ACL 文件格式表达的用户规则。
官方地址:https://redis.io/docs/latest/commands/acl-list/
用redis-cli --raw ACL LIST分别导出两台实例,按“完整用户规则行”排序后执行diff -u。不要把一行里的规则 token 再排序,因为 Redis ACL 规则按从左到右解释。
下面只讨论导出、规范化和比较,不执行 ACL SETUSER、ACL LOAD 等修改动作。
ACL LIST 导出的内容到底是什么
Redis 官方文档把 ACL LIST 定义为导出当前有效规则的命令。通常可以把返回结果理解为“一行一个用户”,每行以 user 和用户名开头,后面跟着启停状态、密码规则、键模式、频道模式和命令类别等 ACL 规则。
user default on nopass ~* &* +@all user app on #~cache:* &events:* +@read -@dangerous
示例中的哈希只是脱敏占位,不应把真实导出文件直接贴到工单或聊天窗口。ACL 规则的排列不是普通无序标签:官方 ACL 说明强调规则从左到右生效,后面的规则可能覆盖前面的允许或禁止。因此,比较时可以改变“用户行”的排列,却不要拆开单行后按字母重排。

先把两台实例导出成同一种文本
两端都使用 --raw,让 redis-cli 输出更适合保存和比较的原始行。认证方式用 --askpass 或现有安全凭据管理方式,示例不把密码写进命令行。
# 从实例 A 导出有效 ACL 规则;--raw 保留每个用户一行 redis-cli -h redis-a.example --user audit-reader --askpass --raw ACL LIST > acl-a.txt # 从实例 B 导出有效 ACL 规则;示例地址只用于说明,不代表真实环境 redis-cli -h redis-b.example --user audit-reader --askpass --raw ACL LIST > acl-b.txt # 只对完整用户行排序,不拆开单行中的 ACL 规则 LC_ALL=C sort acl-a.txt > acl-a.sorted.txt LC_ALL=C sort acl-b.txt > acl-b.sorted.txt
这里的排序目的是消除两台实例返回用户的顺序差异。LC_ALL=C 让同一批文件在不同机器上使用一致的字节序排序,便于审计脚本重复运行。它不会改变任何 Redis 权限,也不会改变一行内部的规则先后。
用 diff 区分三类权限差异
规范化后直接比较两个完整文件:
# 输出统一格式的差异;--- 和 +++ 分别代表两端文件 diff -u acl-a.sorted.txt acl-b.sorted.txt
看结果时可以按下面的方式判断:
| diff 现象 | 通常表示 | 优先复核 |
|---|---|---|
只有 -user ... | 实例 A 有而实例 B 没有,或整行规则不同 | 用户名、启停状态、密码规则、键和命令范围 |
只有 +user ... | 实例 B 有而实例 A 没有,或整行规则不同 | 是否是迁移后新增账号,是否超出变更单 |
| 同名用户出现一删一加 | 用户名相同但有效规则行不同 | 逐段比较规则,不要只看用户是否存在 |
如果担心终端颜色或上下文影响归档,可以把差异保存为文件。对 ACL 导出文件和差异文件都设置最小访问权限,并在审计结束后按组织的保留策略清理。
# 保存差异并限制本地文件的默认可读范围
umask 077
diff -u acl-a.sorted.txt acl-b.sorted.txt > acl-diff.patch || diff_status=$?
# diff 返回 1 表示存在差异,不要把它误当成命令执行失败
if [ "${diff_status:-0}" -gt 1 ]; then
echo "diff 执行失败,请检查输入文件" >&2
exit "${diff_status}"
fi
迁移前后的边界别混在一起
ACL LIST 适合回答“当前两台实例的有效用户规则是否一致”,但它不是完整的迁移动作。导出文件能帮助发现用户、键模式、频道模式和命令类别的差异;它不能替你确认客户端是否拿到了正确密码,也不能证明业务连接已经切换。
实际迁移时,我会把审计分成三层:先比较 ACL 规则文本,再由授权人员确认密码和凭据分发,最后单独安排应用连接切换。不要因为 diff 为空就把生产凭据写入脚本,也不要把导出的规则文件当成可公开分享的普通日志。

几个容易误判的问题
为什么不能把每行拆开排序? 因为 ACL 规则的左到右顺序有语义,拆开后可能把原本有意义的覆盖关系改写成另一种文本。
为什么同一个用户会显示成一删一加? diff 比较的是整行文本,只要该用户的一项规则变化,就会以旧行删除、新行新增的方式呈现。这正好提醒你逐项查看,而不是把它误判成两个用户。
ACL LIST 能否直接恢复另一台实例? 本文不把导出结果当成自动恢复脚本。恢复或修改需要单独的变更流程、权限审批和凭据处理;本方法只负责提供可审计的只读对照材料。
总结
比较 Redis ACL 的关键不是把输出“洗成任意格式”,而是保持每个用户规则行的语义,再消除用户行顺序造成的噪声。两端用 --raw ACL LIST 导出,整行排序后用 diff -u 对照,就能清楚看到新增用户、缺失用户和同名用户权限变化,同时把审计与权限修改、凭据切换分开。
-
117 收藏
-
426 收藏
-
171 收藏
-
113 收藏
-
195 收藏
-
314 收藏
-
233 收藏
-
317 收藏
-
182 收藏
-
135 收藏
-
223 收藏
-
351 收藏
-
380 收藏
-
241 收藏
-
408 收藏
-
302 收藏
-
172 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习