news 2026/10/7 2:02:32

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Samba 4 域控运维脚本集:备份、巡检与信息采集实战

简介:这份资源汇集了在 Samba 4(AD-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.7,Stretch 是 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" \ --server=127.0.0.1 \ 2>&1 | tee -a "$LOG_FILE" # 2. rsync 同步 sysvol,保留 ACL 和扩展属性 rsync -aAX --delete \ "${SYSVOL_PATH}/" \ "${BACKUP_DIR}/sysvol/" \ 2>&1 | tee -a "$LOG_FILE" # 3. 备份 /etc/samba 配置 rsync -aAX --delete \ "${SAMBA_ETC}/" \ "${BACKUP_DIR}/etc-samba/" \ 2>&1 | tee -a "$LOG_FILE" # 4. 记录当前域级别和 FSMO 角色,便于恢复时核对 samba-tool domain level show > "${BACKUP_DIR}/domain-level.txt" 2>&1 samba-tool fsmo show > "${BACKUP_DIR}/fsmo.txt" 2>&1 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 2>&1 echo "===== FSMO 角色 =====" samba-tool fsmo show 2>&1 echo "===== 域控列表 =====" samba-tool domain trusts list 2>&1 echo "===== 用户数量 =====" samba-tool user list 2>&1 | wc -l echo "===== 计算机账户数量 =====" samba-tool computer list 2>&1 | wc -l echo "===== 组数量 =====" samba-tool group list 2>&1 | wc -l echo "===== sysvol 目录结构 =====" find /var/lib/samba/sysvol -maxdepth 3 -type d 2>&1 | head -50 echo "===== sysvol ACL 检查(前 20 行) =====" samba-tool ntacl sysvolcheck 2>&1 | head -20 echo "===== Samba 版本 =====" samba-tool -V 2>&1 echo "===== 服务状态 =====" systemctl status samba-ad-dc --no-pager 2>&1 | 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.5,DFS-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.x,Stretch 是 4.5.x,backports 里 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" --server=127.0.0.1 samba-tool ntacl sysvolcheck > "${BACKUP_DIR}/sysvolcheck.txt" 2>&1 fi

bc在 Debian 最小化安装里可能没有,需要apt install bc。如果不想引入额外依赖,可以用dpkg --compare-versions替代,这是 Debian 自带的版本比较工具:

if dpkg --compare-versions "$SAMBA_VER" lt "4.5"; then echo "使用 4.2 兼容模式" fi

dpkg --compare-versions的lt是严格小于,le是小于等于。这个工具在 Jessie 和 Stretch 上都可用,不需要额外装包。

3.2 从零跑通第一个备份:目录准备与权限

在跑备份脚本之前,有几件事必须先做。第一,确认/backup分区有足够空间。一个中等规模的 AD(500 用户、50 个 GPO)的 sysvol 大约 200MB 到 1GB,LDB 备份大约 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 2>&1

日志轮转用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 \ --newservername=dc-restore \ --targetdir=/var/lib/samba \ --host-ip=192.168.1.100 \ --hostname=dc-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 \ '(objectClass=user)' \ sAMAccountName whenChanged \ | grep -E '^(sAMAccountName|whenChanged):' \ | paste - - \ | sort > /backup/samba4/user-changes-$(date +%Y%m%d).txt

paste - -把两行合并成一行,sort让输出稳定,方便 diff。这个文件不大,500 用户的域大概几十 KB,保留 30 天也没压力。

从那以后我每次改完 Samba 配置或者加完新 GPO,都强制走一遍samba-tool ntacl sysvolcheck加一次手动备份,确认 ACL 和 LDB 都正常才收工。这套脚本不复杂,但省下来的排障时间是以小时计的。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 1:59:28

银河麒麟V10内存不释放?MemAvailable与定时清理实战解析

简介&#xff1a;面向银河麒麟V10服务器运维人员的内存泄漏排查与定时清理方案&#xff0c;解决系统长时间运行后可用内存逐渐减少、性能下降甚至宕机的隐患。压缩包共3个文件&#xff0c;含2个shell脚本与1个txt配置说明&#xff0c;脚本用于定时监控并释放内存&#xff0c;tx…

作者头像 李华