ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Samba 4 域控运维脚本集:备份、巡检与信息采集实战

Samba 4 域控运维脚本集:备份、巡检与信息采集实战 简介这份资源汇集了在 Samba 4AD-DC环境中日常运维常用的 Shell 脚本集合面向在 Debian Jessie 与 Debian Stretch 上搭建、维护 Samba 域控及成员服务器的系统管理员与运维人员。内容涵盖备份、权限检查、sysvol ACL 设置、域信息查看、DNS 批量添加、数据库复制检查与调试信息收集等场景可帮助读者快速完成域控部署后的巡检与排错。资源包共 25 个文件以 12 个 sh 脚本为核心辅以 9 个 txt 操作说明、3 个 md 文档及 1 个 backup_samba4 备份脚本整体约 71KB体积轻便、便于随取随用。其中脚本均经 Debian Jessie 与 Stretch 实测并附有 howto 类文本记录安装与检查流程读者可据此复现域控、成员文件服务器等典型配置并借助检查类脚本定位权限与复制异常。目前已有 247 人学习下载适合需要落地 Samba 4 运维脚本的中高级管理员参考。1. 从一台域控的深夜告警说起这套 Samba 4 脚本到底救什么场凌晨两点AD DC 的 sysvol 同步告警又响了。Debian Jessie 上的 Samba 4 域控跑了三年samba-tool能查的东西越来越多但真到排障时你还是得手动敲一长串命令去拼状态、翻日志、比对 sysvol 副本。这套在 Debian Jessie 和 Debian Stretch 上实测过的 Samba 4 脚本集解决的就是这个场景——把日常巡检、备份、信息采集这些重复动作固化成可复用的 Shell 脚本。它不替代samba-tool而是把samba-tool的输出、sysvol 的目录结构、Samba 的配置文件状态打包成几个能直接跑的命令。适合谁手上管着一到多个 Samba 4 AD DC、系统还停留在 Debian 8/9 时代、又不想每次排障都从零拼命令的运维。如果你用的是 Ubuntu 或已迁移到 Samba 4.1x 以上部分脚本逻辑仍可参考但路径和参数需要按实际环境调整。2. 脚本集拆解backup-script、samba-info 与 sysvol 巡检的底层逻辑2.1 为什么是 Shell 而不是 Python 或 Ansible这套脚本选择 Shell 作为实现语言原因很实际Debian Jessie 自带的 Python 是 2.7Stretch 是 3.5而 Samba 4 的samba-tool本身就是一个 Python 脚本。如果你用 Python 再包一层很容易和系统自带的 Samba Python 模块产生版本冲突——这是血泪经验samba-tool依赖的samba模块路径一旦被虚拟环境覆盖域控的日常命令直接报ImportError。Shell 脚本只调用samba-tool的可执行入口不碰 Python 模块加载天然规避了这个问题。另一个原因是 sysvol 的备份和巡检本质上是文件系统操作加命令输出解析rsync、find、grep、awk的组合比 Python 的os.walk加subprocess更直接也更容易在 rescue 模式下运行。从脚本结构看这套资源的核心可以拆成三块备份逻辑、信息采集逻辑、sysvol 状态检查逻辑。备份脚本通常以rsync为主配合samba-tool domain backup或samba-tool ntacl sysvolreset的前后置检查信息采集脚本则围绕samba-tool domain level show、samba-tool user list、samba-tool group list、samba-tool computer list等命令做输出格式化sysvol 巡检脚本会检查/var/lib/samba/sysvol下的目录结构、ACL 继承标记和副本同步状态。这三块不是孤立的备份前需要先确认 sysvol 状态信息采集的结果又要作为备份是否完整的佐证。2.2 backup-script 的执行链路与关键参数一个典型的 Samba 4 备份脚本执行链路是这样的先检查 Samba 服务状态再确认 sysvol 挂载点可读然后执行samba-tool domain backup online或samba-tool domain backup offline最后用rsync把 sysvol 和/etc/samba同步到备份目录。下面是一个可抄作业的骨架我按 Debian Jessie/Stretch 的路径习惯做了适配#!/bin/bash # samba4-backup.sh - Samba 4 AD DC 备份脚本 # 适用: Debian Jessie (Samba 4.2/4.5) / Stretch (Samba 4.5/4.9) set -euo pipefail BACKUP_ROOT/backup/samba4 DATE$(date %Y%m%d-%H%M%S) BACKUP_DIR${BACKUP_ROOT}/${DATE} SYSVOL_PATH/var/lib/samba/sysvol SAMBA_ETC/etc/samba LOG_FILE${BACKUP_ROOT}/backup.log # 检查关键路径是否存在 for p in ${SYSVOL_PATH} ${SAMBA_ETC}; do if [ ! -d $p ]; then echo [ERROR] 路径不存在: $p | tee -a $LOG_FILE exit 1 fi done # 检查 samba 服务是否在运行 if ! systemctl is-active --quiet samba-ad-dc; then echo [WARN] samba-ad-dc 未运行尝试继续备份 | tee -a $LOG_FILE fi mkdir -p ${BACKUP_DIR} # 1. 使用 samba-tool 做在线备份LDB 数据库 samba-tool domain backup online \ --targetdir${BACKUP_DIR}/ldb \ --server127.0.0.1 \ 21 | tee -a $LOG_FILE # 2. rsync 同步 sysvol保留 ACL 和扩展属性 rsync -aAX --delete \ ${SYSVOL_PATH}/ \ ${BACKUP_DIR}/sysvol/ \ 21 | tee -a $LOG_FILE # 3. 备份 /etc/samba 配置 rsync -aAX --delete \ ${SAMBA_ETC}/ \ ${BACKUP_DIR}/etc-samba/ \ 21 | tee -a $LOG_FILE # 4. 记录当前域级别和 FSMO 角色便于恢复时核对 samba-tool domain level show ${BACKUP_DIR}/domain-level.txt 21 samba-tool fsmo show ${BACKUP_DIR}/fsmo.txt 21 echo [OK] 备份完成: ${BACKUP_DIR} | tee -a $LOG_FILE这段脚本的关键参数说明--targetdir指定 LDB 备份的输出目录samba-tool domain backup online会在目标目录下生成一个包含sam.ldb和私有目录的压缩包恢复时用samba-tool domain backup restore指向这个目录即可。rsync -aAX中的-A保留 ACL-X保留扩展属性这两个参数对 sysvol 至关重要——sysvol 里的 GPO 目录依赖 ACL 继承丢了 ACL 等于 GPO 失效。--delete让备份目录和源目录保持一致但第一次跑之前要确认备份目录是空的否则会误删。set -euo pipefail是 Shell 脚本的后悔药任何命令返回非零就终止避免备份到一半继续跑导致数据不一致。2.3 samba-info 脚本如何把散落的状态拼成一张图samba-tool的子命令很多但排障时你需要的是「一眼看全」。samba-info 类脚本的做法是把多个命令的输出按固定顺序拼接再过滤掉无关行。常见做法是#!/bin/bash # samba-info.sh - 采集 Samba 4 域控关键状态 # 输出可直接重定向到文件用于工单或对比 echo 域级别 samba-tool domain level show 21 echo FSMO 角色 samba-tool fsmo show 21 echo 域控列表 samba-tool domain trusts list 21 echo 用户数量 samba-tool user list 21 | wc -l echo 计算机账户数量 samba-tool computer list 21 | wc -l echo 组数量 samba-tool group list 21 | wc -l echo sysvol 目录结构 find /var/lib/samba/sysvol -maxdepth 3 -type d 21 | head -50 echo sysvol ACL 检查前 20 行 samba-tool ntacl sysvolcheck 21 | head -20 echo Samba 版本 samba-tool -V 21 echo 服务状态 systemctl status samba-ad-dc --no-pager 21 | head -15这个脚本的价值在于输出格式固定。你可以把它加到 cron 里每天跑一次输出存到带日期的文件出问题时直接 diff 两天的输出就能看出是用户数突变、FSMO 角色漂移还是 sysvol ACL 被改。samba-tool ntacl sysvolcheck在 Samba 4.5 以上版本可用Jessie 自带的 4.2 可能没有这个子命令需要降级用samba-tool ntacl get逐个目录查。find的-maxdepth 3是为了避免在大型 sysvol 上跑太久实际排障时如果怀疑某个 GPO 目录有问题再把深度调大。2.4 sysvol 巡检ACL、副本与 GPO 目录的三角关系sysvol 的问题往往不是「文件丢了」而是「ACL 不对」或「副本没同步」。Samba 4 的 sysvol 默认路径是/var/lib/samba/sysvol下面按域名分目录再下面是Policies和scripts。每个 GPO 目录的 ACL 必须包含Authenticated Users的读权限和Domain Admins的完全控制继承标记必须开启。巡检脚本通常做三件事检查目录是否存在、检查 ACL 是否匹配预期、检查多 DC 环境下副本是否一致。多 DC 场景下sysvol 的同步依赖 Samba 内部的 DFS-R 或老式的rsync加 cron。如果你用的是 Samba 4.2/4.5DFS-R 支持不完整很多环境还是靠rsync定时同步。这时候巡检脚本要对比两个 DC 上同一 GPO 目录的find输出和md5sum。常见做法是在每个 DC 上跑一遍find /var/lib/samba/sysvol -type f -exec md5sum {} \; | sort然后把结果拉到一起 diff。如果发现某个 GPO 的GPT.INI版本号不一致说明同步没完成或冲突了。注意samba-tool ntacl sysvolreset会重置 sysvol 下所有 ACL执行前务必确认你有完整的备份。这个命令在 ACL 混乱时是救星但在 ACL 正常时跑一遍可能引入不必要的变更。3. 在 Debian Jessie 与 Stretch 上落地依赖、路径与执行顺序3.1 两个发行版的 Samba 版本差异与脚本适配点Debian Jessie 默认仓库里的 Samba 是 4.2.xStretch 是 4.5.xbackports 里 Stretch 可以到 4.9。这个版本跨度直接影响脚本能用的子命令。samba-tool domain backup在 4.2 里只有offline模式online模式是 4.5 才稳定的。samba-tool ntacl sysvolcheck在 4.2 里不存在。samba-tool fsmo show在 4.2 和 4.5 里输出格式略有不同4.5 会多一行Role owner的标记。适配策略是脚本开头用samba-tool -V取版本号然后按主版本号分支。比如SAMBA_VER$(samba-tool -V | awk {print $2}) SAMBA_MAJOR$(echo $SAMBA_VER | cut -d. -f1,2) if [ $(echo $SAMBA_MAJOR 4.5 | bc) -eq 1 ]; then # 4.2 分支用 offline 备份跳过 sysvolcheck samba-tool domain backup offline --targetdir${BACKUP_DIR}/ldb else # 4.5 分支用 online 备份跑 sysvolcheck samba-tool domain backup online --targetdir${BACKUP_DIR}/ldb --server127.0.0.1 samba-tool ntacl sysvolcheck ${BACKUP_DIR}/sysvolcheck.txt 21 fibc在 Debian 最小化安装里可能没有需要apt install bc。如果不想引入额外依赖可以用dpkg --compare-versions替代这是 Debian 自带的版本比较工具if dpkg --compare-versions $SAMBA_VER lt 4.5; then echo 使用 4.2 兼容模式 fidpkg --compare-versions的lt是严格小于le是小于等于。这个工具在 Jessie 和 Stretch 上都可用不需要额外装包。3.2 从零跑通第一个备份目录准备与权限在跑备份脚本之前有几件事必须先做。第一确认/backup分区有足够空间。一个中等规模的 AD500 用户、50 个 GPO的 sysvol 大约 200MB 到 1GBLDB 备份大约 50MB 到 200MB加上/etc/samba的几 MB单次备份预留 2GB 比较稳妥。第二备份目录的权限要收紧因为 LDB 备份里包含域内所有账户的密码哈希。常见做法是chmod 700 /backup/samba4并且备份目录不要放在 Web 可访问路径下。第三samba-tool domain backup online需要绑定到 127.0.0.1 的 445 端口如果 Samba 服务没跑或者防火墙拦了本地回环会报Connection refused。Jessie 默认的 iptables 规则通常不拦回环但如果你手动加过规则要确认lo接口的 445 是放行的。第四rsync同步 sysvol 时如果源目录里有正在写入的文件可能拿到不一致的副本。Samba 4 的 sysvol 写入频率不高但 GPO 编辑时会触发。稳妥做法是在备份前先跑一次samba-tool ntacl sysvolcheck确认没有报错再开始 rsync。3.3 把脚本挂到 cron时间窗口与日志轮转备份脚本跑通之后下一步是自动化。cron 的时间窗口选择有讲究不要和 Samba 的内部同步任务撞车。如果你用rsync做 DC 间 sysvol 同步那个任务通常也在凌晨跑。两个任务同时读写 sysvol 会导致 rsync 拿到半截文件。常见做法是备份任务放在同步任务之后一小时比如同步在 1:00备份在 2:00。cron 条目示例# /etc/cron.d/samba4-backup # 每天凌晨 2:30 执行备份日志追加到 backup.log 30 2 * * * root /usr/local/bin/samba4-backup.sh /backup/samba4/backup.log 21日志轮转用logrotate配置放在/etc/logrotate.d/samba4-backup/backup/samba4/backup.log { weekly rotate 8 compress delaycompress missingok notifempty create 600 root root }rotate 8保留 8 周日志create 600确保新日志文件权限是 600因为日志里可能包含域控的路径和版本信息。delaycompress让最近一份日志不压缩方便直接tail查看。提示cron 执行时的环境变量和交互式 Shell 不同samba-tool可能因为PATH缺失而找不到。脚本开头显式设置PATH/usr/sbin:/usr/bin:/sbin:/bin能避免大部分「手动跑没问题cron 跑就报错」的玄学问题。4. 避坑与排查sysvol ACL 丢失、备份不完整、版本不匹配4.1 现象备份脚本报NT_STATUS_ACCESS_DENIED但手动跑samba-tool正常原因通常是 cron 执行时没有加载 Samba 的 Kerberos 票据或机器账户凭据。samba-tool domain backup online需要以域管理员身份绑定手动跑时你用的是当前登录的 root 或管理员票据cron 里没有。解决方式是在脚本里显式指定--username和--password或者用kinit先获取票据。更稳妥的做法是把备份脚本放在root的 crontab 里并且确保/etc/krb5.keytab存在且可读。如果还是不行检查/var/log/samba/log.samba里的具体错误码。4.2 现象rsync 同步 sysvol 后GPO 在客户端不生效原因大概率是 ACL 丢了。rsync不加-A和-X时只同步文件内容和基本权限不同步 ACL 和扩展属性。sysvol 里的 GPO 目录依赖 ACL 继承丢了 ACL 后客户端读取 GPO 时会被拒绝。解决方式是备份和恢复时都用rsync -aAX并且在恢复后跑一次samba-tool ntacl sysvolreset重建 ACL。注意sysvolreset会重置所有 ACL 为默认值如果你有自定义 ACL需要先导出再导入。4.3 现象samba-tool domain backup online在 Jessie 上报Unknown command原因就是版本问题。Jessie 自带的 Samba 4.2 没有online子命令。解决方式是改用samba-tool domain backup offline但offline要求 Samba 服务停止这意味着备份期间域控不可用。如果不能让域控停机另一个方案是升级到 Stretch 的 backports 版本或者手动用ldbsearch导出sam.ldb的关键表。ldbsearch的用法是ldbsearch -H /var/lib/samba/private/sam.ldb (objectClass*) backup.ldif但这种方式不包含 sysvol 和注册表恢复时更麻烦。4.4 现象备份目录越来越大磁盘被占满原因是脚本没有清理旧备份。rsync --delete只清理目标目录里源目录没有的文件不会删除旧的日期目录。解决方式是在脚本末尾加一段保留策略比如只保留最近 7 天的备份# 保留最近 7 天删除更早的 find ${BACKUP_ROOT} -maxdepth 1 -type d -name 20* -mtime 7 -exec rm -rf {} \;-maxdepth 1确保只删日期目录不会递归删到备份内容。-mtime 7是 7 天前。执行前先用-print代替-exec确认要删的目录列表避免误删。4.5 现象多 DC 环境下两个 DC 的 sysvol 内容不一致原因是同步任务失败或冲突。先检查两个 DC 上同一 GPO 的GPT.INI版本号如果版本号不同说明一个 DC 上的修改没同步过去。解决方式是手动触发一次同步或者用rsync从主 DC 强制覆盖。但强制覆盖前要确认哪边的版本是新的否则会把新 GPO 覆盖掉。常见做法是比对GPT.INI里的Version行数字大的那边是新版本。如果两边版本号相同但文件内容不同说明有冲突需要人工介入。5. 进阶用 samba-tool 的 LDIF 导出做增量校验与恢复演练备份脚本跑顺之后真正决定它有没有用的是恢复演练。我一般会每季度做一次「假装域控挂了」的演练找一台干净的 Debian Stretch 虚拟机把备份目录挂上去跑samba-tool domain backup restore然后对比恢复后的用户列表、GPO 列表和 FSMO 角色。这个过程中最容易翻车的地方是--newservername参数——如果你恢复到一个新主机名必须显式指定否则 Samba 会尝试用原主机名绑定导致冲突。恢复命令的骨架# 在干净机器上恢复 samba-tool domain backup restore \ --backup-file/backup/samba4/20250101-023000/ldb/samba-backup-*.tar.bz2 \ --newservernamedc-restore \ --targetdir/var/lib/samba \ --host-ip192.168.1.100 \ --hostnamedc-restore--backup-file指向samba-tool domain backup online生成的压缩包通常在--targetdir下的ldb子目录里。--newservername是新 DC 的主机名--targetdir是恢复目标路径--host-ip和--hostname用于生成新的 DNS 记录。恢复完成后需要手动把 sysvol 从备份目录 rsync 回去因为domain backup restore只恢复 LDB 数据库不恢复 sysvol 文件。增量校验的思路是每次备份后用ldbsearch导出用户和计算机账户的sAMAccountName和whenChanged属性存成基线文件。下次备份前再导一次diff 两个文件就能看出哪些账户被修改过。这个做法比全量对比快得多适合每天跑。ldbsearch的命令是ldbsearch -H /var/lib/samba/private/sam.ldb \ (objectClassuser) \ sAMAccountName whenChanged \ | grep -E ^(sAMAccountName|whenChanged): \ | paste - - \ | sort /backup/samba4/user-changes-$(date %Y%m%d).txtpaste - -把两行合并成一行sort让输出稳定方便 diff。这个文件不大500 用户的域大概几十 KB保留 30 天也没压力。从那以后我每次改完 Samba 配置或者加完新 GPO都强制走一遍samba-tool ntacl sysvolcheck加一次手动备份确认 ACL 和 LDB 都正常才收工。这套脚本不复杂但省下来的排障时间是以小时计的。希望帮到你。本文还有配套的精品资源点击获取
返回列表