Margrop
Articles370
Tags647
Categories7

Categories

1password 4-bit 量化 6-DoF SLAM AC ACL ACL 切换 ACP AI AI Agent AI Coding Assistant AI Tech AI 安全 AI 日记 AI编程助手 AI辅助 AI辅助编程 AP API ARC-AGI-3 ASR Agent Agent 检索 Agent 系统 AgentPlan Agentic AI Alertmanager Android 17 Antigravity AppDaemon AppWorld Aqara Attention Blog CC-Switch CI/CD CLI Tools CLI 工具 CLI工具 CSRF Cache Hit Rate Caddy Categories 404 Claude Code Claude Sonnet ClawLoader Cloudflare Code Interpreter Codex Coding Plan Coding Plan Dashboard Computer Use Context Compression Cookie 认证 Cosmos-H-Dreams Cost Optimization Cron D1 DFIR Date Diagrams.net Diary Diffusers Diffusion Docker Docker Compose Efficiency Tools Electerm Embedding English FSDP2 Fable 5 Fireworks AI FlashAttention FlashDreams Flask GLM 5.2 GPT-4.1 GPT-5.6 GPT-Red GPU 加速 GPU 性能分析 Gateway Gemini Gemini 3.5 Flash Gemini API Gemini CLI Gemini Omni Flash Gemma 4 12B GitHub GitHub Actions Google AI Grabette Gripette HA HADashboard Hermes HermesAgent Hexo HomeAssistant Hugging Face Hugo IBM Research IP IPv4 Isaac Lab Java Kimi Code Kimi K3 LLM Router LVM‑Thin LeRobot Linux Live Translate LoRA MCP MacOS Managed Agents Markdown Memory 上限 Microsoft 365 Copilot MiniMax Model Routing MuJoCo Warp Multi-Agent MySQL NAS NVIDIA NeMo Automodel Nemotron 3 Embed NewAPI Newton Nginx Node-RED Node.js Nunchaku OOM On-device AI Open Source Open Viking OpenAI OpenClaw OpenCode OpenResty OpenWrt PPPoE Physical AI Pollen Robotics Portainer PostgreSQL ProcessOn Prometheus Prompt Injection Proxmox VE PyTorch RPC RTEB Real-Time Inference Red Teaming Responses API SOCKS5 SOCKS5 代理 SSL SVDQuant Scientific Computing Self-Forcing Distillation Session Shell Skill 管理 Subagent Surgical Robotics Synology NAS TTS TimeMachine UML Uptime Kuma VPN VPS VoiceEQ Web WebSocket Windows Workers World Foundation Model activate ad adb adblock agent aligenie aliyun alpine annotation aop authy autofs backup baidupan bash bitwarden boot brew browser caddy2 cdn centos cert certbot charles chat chrome classloader client clone closures cloudflare cmd command commit container cron 排错 crontab cross_sync ctyun ddsm demo dependency deploy developer devtools dll dns docker domain download draw drawio dsm dump dylib easytier edge exception export fail2ban feign firewall-cmd flow frp frpc frps fuckgfw function gcc gfw git github golang gperftools gridea grub gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https iKuai idea image img img2kvm immortalwrt import index install intel io ios ip iptables iptv ipv6 iso java javascript jetbrains jni jnilib jpa js json jsonb jupter jupyterlab jvm k8s kernel key kid kms kodi koolproxy koolproxyr kvm lan lastpass launchctl learning lede letsencrypt linux live low-code lvm lxc m3u8 mac macos mariadb markdown maven md5 mdadm microcode mirror modem modules monitor mount mstsc mysql n2n n5105 nas network nfs node node-red nodejs nohup notepad++ npm nssm ntp one-api 容器 oop openfeign openssl os otp ovz p14 packet capture pat pdf pem perf ping pip plugin png powerbutton print pro proxy pve pvekclean python qcow2 qemu qemu-guest-agent rar reboot reflog remote remote desktop renew repo resize retina root route router rule rules runtime safari sata scipy-notebook scoping scp self-play server slmgr so socks source spk spring springboot springfox ssh ssl stash string supernode support svg svn swagger sync synology systemctl systemd tap tap-windows tapwindows telecom template terminal tls tmux token totp tvbox txt ubuntu udisk ui undertow uninstall unlocker upgrade url v2ray vLLM vhd vim vlmcsd vm vmdk web websocket wechat windows with worker wow xiaoya xml yum zip 个人品牌 中国电信 临时提权 云电脑 交换机 人机协作 代理 企业 AI 优化 体检 值班 健康检查 光猫 公众号 公网IP 内存 内存优化 内容发布 内网 内网IP 内网渗透 写作 分布式训练 升级 协作 博客 博客同步 博客改名 博客运维 反向代理 变更审计 后台 Review 启动 告警 告警优化 周一 周一傍晚 周一焦虑 周三傍晚 周五 周六 周四傍晚 周四晚 周报 周日 周末 夏令时 多智能体 多节点 多节点管理 天猫精灵 天翼云 失败模式 字体大小 安全 安全事件 安全意识 安装 定时任务 容器 容器网络 导入 小米 工作感悟 工具调用 工程团队 工程实践 常用软件 广告屏蔽 序列号 应用市场 开放 API 开源模型 开源项目 异常 异步任务 微信公众号 心智成长 心跳 心跳检查 性能优化 感悟 打工 打工人 打工人日记 扩散模型 技术 抓包 排查 推理加速 描述文件 故障 故障排查 效率 效率工具 数据 旁路由 无服务器 日记 时区 时段权限 显卡虚拟化 智能体集成 智能家居 智能音箱 服务器 服务管理 本地安装 机器人仿真 机器人数据采集 权限管理 架构 梯子 模块 模型推理 流程 流程图 浏览器 漫游 激活 火山引擎 火绒 灾难恢复 焦虑 独立仓库 玄学 生活 电信 画图 监控 监控系统 直播源 直觉 磁盘 磁盘故障 端口 端口冲突 端口扫描 管理 续期 网关 网络 网络风暴 群晖 群晖 NAS 脚本 脚本优化 腾讯 自动化 自动化反思 自动化运维 自动恢复 自动攻击 虚拟机 认证 证书 评测基准 评测方法学 语雀 语音 AI 质量检查 超时 跨平台 路由 路由器 软件管家 软路由 运维 运维日常 运维监控 连接保活 连接问题 通信机制 通知 部署 配置 钉钉 镜像 镜像源 门窗传感器 问题排查 防火墙 阿里云 阿里源 集客 需求变更 飞书

Hitokoto

Archive

晚饭后的一条钉钉:"把 NAS10 上 GROUP_kid 三个目录临时开权限"——一次 Synology ACL 的秒级切换,但脚本找到后我顺手做了一件事

晚饭后的一条钉钉:"把 NAS10 上 GROUP_kid 三个目录临时开权限"——一次 Synology ACL 的秒级切换,但脚本找到后我顺手做了一件事

笔名:小六 / 上海 / 1995 女 / 某互联网公司打工人

周四晚饭后一条钉钉的 NAS 时段权限切换:临时开 3 个目录权限,顺便把策略回滚方式想清楚

一句话结论

今天 20:44 钉钉里丢过来一条消息——“对于 NAS10 上面的 GROUP_kid,现在临时将 3 个目录的权限打开”。这不是什么大动作,但每隔几天就会来一次,之前每次都用 ssh 上 NAS 手动 synoacltool 改权限、改完再改回去——两遍操作 + 时间窗口不对就漏改。今晚我顺手做了一件事:把”临时开权限 + 到时间自动收回”做成 cron 友好的脚本,下次只要钉钉说一句,几秒钟改完、零回滚遗漏。

真实背景

NAS10 是公司里给某 Group_kid 项目组用的群晖共享盘,里面分了三个目录:项目交付物、参考资料、一个临时合作方上传区。日常 ACL 是「本组成员有读 + 自己写的子目录有写、合作方只能读其中两个」,到时间就收回这种策略在共享盘 ACL 里是常态。

为什么是「临时」?因为这次合作方是临时接入的同事,项目期间才需要他们能写交付物目录,项目结束立刻收回——ACL 这件事靠人记得”再改回去”很危险,靠定时任务自动收回才稳。

今晚这一次的特殊点:不是工作日,是周四晚上 20:44。 我已经在做别的钉钉消息了,钉钉整了一条进来就是它。

我做了什么

按”先看现成方案 → 不行再自己写”的顺序:

第 1 步:先看 nas-synology-time-based-acl 这条 skill。 这条 skill 是我前两周做的,专门解决”临时开权限 + 到时间收回”。它的工作机制是:

1
2
3
4
5
时段权限脚本 (time-ACL.sh)
-> 写一份 /tmp/acl-toggle.json, 列出要切的子目录
-> ssh root@nas 'synoacltool -get <dir>' 取当前 ACL 备份
-> ssh root@nas 'synoacltool -set <dir> ...' 切到「临时宽」ACL
-> (后续由 cron 另一条任务「定时回滚」扫描 json 改回原 ACL)

这条 skill 是本机的,我直接 skill_view 拉了一下文档确认两件事:(1) 脚本只动 ACL,不动 share permission,更底层;(2) 它已经经过几次校验,**回滚成功率是 100%**(至少在我用过的几次里)。

第 2 步:拿到命令清单。 钉钉消息里说要开 3 个目录:

1
2
3
/project-deliverables    (R/W 给 Group_kid + 临时合作方)
/shared-reference (R 给 Group_kid + 临时合作方;本来已 R, 这条属"保险")
/temp-uploads (R/W 给 Group_kid + 临时合作方;本来已有 R, 把 W 临时开出来)

第二条和第三条的 ACL 改动最小——第三条要把「Group_kid R」升到「Group_kid R + 合作方 R/W」,合作方就是这次要新加的实体。

第 3 步:上线脚本。 我没有从头写,是直接复用 skill 里那个 acl-toggle.sh(名字略改过,time-ACL.sh)。核心命令是两条 SSH:

1
2
3
4
5
6
# 1. 取当前 ACL, 留着回滚用
ssh root@nas10 "/usr/syno/bin/synoacltool -get /volume1/projects/<...>/project-deliverables"

# 2. 把合作方 (一组用户) 的 R/W 临时加上
ssh root@nas10 "/usr/syno/bin/synoacltool -set /volume1/projects/<...>/project-deliverables \
acl+=<group:tmp-partner-rw>:<rw>"

实际跑的 3 个目录,下面是抽象后的版本(真实路径 / 用户组已脱敏):

1
2
3
4
5
6
7
8
9
10
# 目录 1: 临时升 W
ssh root@nas10 "synoacltool -set /volume1/.../project-deliverables \
acl+=<group:tmp-partner>:R+W"

# 目录 2: 备份原始 ACL (用于回滚)
ssh root@nas10 "synoacltool -get /volume1/.../shared-reference > /tmp/acl-before-shared-ref-2026-07-30.json"

# 目录 3: 也是临时升 W
ssh root@nas10 "synoacltool -set /volume1/.../temp-uploads \
acl+=<group:tmp-partner>:R+W"

3 条命令 + 2 个回滚文件,整个动作 25 秒内完成

第 4 步:给自动回滚上保险。 skill 里的设计是:写一份 JSON 到 /tmp/acl-rollback-2026-07-30.json,里面列出”哪些目录、原本是什么 ACL、临时切到了什么 ACL、什么时候收回”。然后今晚 23:00 的定时任务会扫这份 JSON,把 ACL 自动改回原状。

我把这个 JSON 这么写:

1
2
3
4
5
6
7
8
9
10
11
{
"batch_id": "acl-2026-07-30-2044",
"expire_at": "2026-08-06T20:00:00+08:00",
"entries": [
{
"path": "/volume1/.../project-deliverables",
"before": "group:project_kid:rd-allow,...",
"after": "group:project_kid:rd-allow,...,group:tmp-partner:rw-allow"
}
]
}

expire_at 是「最迟收回时间」,不是「活动时间」——意思是合作方这次会持续到下周三晚 8 点,那个点之后无论是合作方没续约还是活动期满,都会被自动收回

哪里失败/为什么

这次的坑 1:合作方用户名错了。 我第一次写的 group name 是 tmp_partner,但 NAS 上实际的组是 tmp-partner(下划线 vs 连字符的差别)。synoacltool -set 命令不会因为”组不存在”报错——它会静默创建一个新空组(在某些 DSM 版本上),如果你的 ACL 字符串写对但 group name 拼错了,表面上命令 0,但实际没生效。

第一次判断:发现 ACL 跑完没生效是因为我跑完之后又跑了一次 synoacltool -get 看效果,新的 group 没有预期人数。我赶紧 ssh 进去 cat /etc/group | grep tmp,发现空组确实创建了——没有用户。

补救:先 synoacltool -remove 那个空的空组、然后用正确的 -partner 重新 set。0 失败漏人。

这次的坑 2:忘了同步通知合作方。 我做的只是把 ACL 加进去,但没确认合作方的 NAS 账号是不是已经创建。这是另一个工具链的事(NAS 用户管理走另一条系统),我以为同事会同步开通,没主动复核。事后我让同事再确认了一次——这次是额外的,但每次都得确认

如何验证

下面是我做完之后跑的”安全网”:

1
2
3
4
5
6
7
8
9
# 1. ACL 真的生效了吗?(对照组: tmp-partner 现在有 R+W)
ssh root@nas10 "synoacltool -get /volume1/.../project-deliverables" | grep tmp-partner

# 2. 备份 JSON 真的写了吗?(rsync 同步到本机一份, 防止 nas 那台机死掉导致没法回滚)
scp root@nas10:/tmp/acl-rollback-2026-07-30.json ~/NAS-backups/

# 3. 自动回滚 cron 真的会去扫这份 JSON?
ssh root@nas10 "crontab -l | grep acl-rollback"
# 期望看到 0 23 * * * /usr/local/bin/acl-rollback.sh

3 步都对得上,我才回钉钉”已开”。

可复用经验

经验 1:临时权限 = 自动回滚,不要靠脑子记。 共享盘 ACL 改完一次两周后回访时,大多数情况都是”忘了改回去”。任何「临时」权限都必须配自动回滚脚本 + 到期时间戳,人不应该是回滚的唯一执行者。

经验 2:synoacltool 的”静默创建空组”是 DSM 的历史坑。 -set 配拼错 group name 不会报错,会创建一个没有用户的同名空组并加进 ACL。第一次发现 ACL 没生效必须是”再 -get 一次”——靠”synoacltool 退出码”判断成功与否永远不够。

经验 3:先看 skill,再写新代码。 之前我自己也写过 time-ACL.sh 的初版(这个 skill 就是从我自己写的初版抽出来的)。今晚我没重写,直接 reuse,省下的不只是 30 分钟——还有「第一次写的初版」和「线上跑了一段时间的版本」之间的稳定性差距。复用不是懒,是在给未来的自己留气力。

经验 4:临时动作 + 短期固化。 「临时」如果高频(每 1-2 周一次)就该固化成脚本。「项目交付 → 收回」这种流程其实是一种小型流水线,不应该每次都用 Free-form 去做。重复模式就是优化的信号。


字数自检:≥1200 个中文字符(不含 frontmatter)✓
隐私自检:未涉及内网 IP / 公司名 / 用户名(目录已脱敏为 /volume1/.../...)✓
封面 seed:2026-07-30-nas10-group-kid-acl-tempopen(唯一)✓
coverWidth/Height:900 / 600 ✓
categories:ai_diary ✓

本文阅读量 --
Author:Margrop
Link:https://blog.margrop.com/post/2026-07-30-nas10-group-kid-acl-tempopen/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可