ARTICLE DETAIL

资讯详情

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

Debian老版本Samba 4运维脚本:批量共享、配置同步与权限导出

Debian老版本Samba 4运维脚本:批量共享、配置同步与权限导出 简介这份资源汇集了在 Samba 4AD-DC环境中日常运维所需的实用脚本面向使用 Debian Jessie 与 Debian Stretch 搭建域控或成员服务器的运维人员与系统管理员。所有脚本均在上述两个 Debian 版本上制作并测试覆盖备份、权限检查、sysvol ACL 设置、域信息查看、DNS 批量添加、数据库复制检查及调试信息收集等场景适合具备一定 Samba 与 Linux 基础、希望提升排障与自动化效率的读者。压缩包共 25 个文件以 12 个 sh 脚本为主体辅以 9 个 txt 操作说明、3 个 md 文档及 1 个 backup_samba4 备份脚本整体约 71KB体积轻便、结构清晰。目前已有 247 人学习下载。读者可从中获得可直接复用的备份与检查脚本、分步骤的 howto 配置笔记以及针对 AD 成员与 AD DC 的域信息展示工具便于快速定位权限、复制与 sysvol 相关问题。1. 从一台老 Debian 文件服务器说起Samba 4 脚本到底能省掉哪些手工活手里还跑着 Debian Jessie 或 Debian Stretch 的机器多半不是测试环境而是某条产线上还在服役的文件服务器、备份节点或者内部共享盘。系统老但业务不能停Samba 4 就是这类机器上最常见的共享方案。标题里说的“有用的 Samba 4 脚本”本质是一批把重复操作固化成命令的运维工具批量建用户、批量建共享目录、同步 smb.conf、检查服务状态、导出权限清单。它们解决的不是“Samba 能不能跑”而是“几十个共享、上百个账号怎么不靠手敲 smbpasswd 和 net 命令熬到半夜”。这套东西适合还在维护 Jessie/Stretch 的运维、需要快速搭内部共享的小团队以及想把老机器管得省心一点的一线工程师。下面按“先搞清原理和选型再落到脚本和参数最后讲坑”的顺序讲透。2. Samba 4 脚本的底层逻辑与 Debian 老版本适配2.1 为什么脚本要围绕 smb.conf、tdbsam 和 net 命令展开Samba 4 在 Debian Jessie 和 Stretch 上的运行模型并不复杂但脚本要写对得先知道它把状态存在哪。核心有三块配置文件/etc/samba/smb.conf、用户数据库默认tdbsam落在/var/lib/samba/private/passdb.tdb、以及运行时进程smbd、nmbd、winbindd。脚本能做的事基本就是围绕这三块做增删改查。用户管理走smbpasswd或pdbedit共享管理靠改 smb.conf 后testparm校验再 reload服务状态用systemctl或service查。Debian Jessie 默认是 systemd但不少从 sysvinit 升上来的机器还留着service兼容层脚本里如果写死一种换台机器就翻车。我一般会在脚本开头探测 init 系统再决定调哪条命令。另一个关键是 Samba 4 的 AD DC 模式和 standalone 模式差别很大。标题里的脚本大多面向 standalone 文件服务器也就是server role standalone server用户是本地 tdbsam 用户不涉及域控。如果你的机器是 AD DC很多脚本里的smbpasswd -a会直接报错因为域控用户要走samba-tool user create。这一点在选脚本前必须确认否则跑一半失败还找不到原因。提示先用testparm -s看server role这一行确认是 standalone 还是 active directory domain controller再决定用哪套用户管理命令。2.2 在 Jessie 和 Stretch 上准备脚本运行环境老 Debian 的软件源已经归档直接apt update大概率 404。要跑脚本先把源指到 archive.debian.org再装依赖。下面这段是我在 Jessie 和 Stretch 上都验证过的准备步骤。# 备份原源列表 cp /etc/apt/sources.list /etc/apt/sources.list.bak # Jessie 用 archive 源Stretch 同理换代号 cat /etc/apt/sources.list EOF deb http://archive.debian.org/debian jessie main contrib non-free deb http://archive.debian.org/debian-security jessie/updates main contrib non-free EOF # 关闭过期检查否则 apt 会拒绝更新 echo Acquire::Check-Valid-Until false; /etc/apt/apt.conf.d/99no-check-valid apt update apt install -y samba samba-common-bin smbclient cifs-utils这段逻辑是先把官方源换成归档源因为 Jessie/Stretch 已不在主源里再用 apt 配置关掉 Valid-Until 检查否则归档源的 Release 文件过期会让 apt 直接罢工最后装 samba 和客户端工具。参数上samba提供 smbd/nmbdsamba-common-bin提供smbpasswd、pdbedit、testparmsmbclient用来做连通性测试cifs-utils是挂载共享时用的。装完用smbd -V确认版本Jessie 一般是 4.2.xStretch 是 4.5.x脚本里如果用到某个子命令先确认这个版本有没有。注意archive.debian.org 只保证包还在不保证安全更新。内网机器可以这么干暴露公网的机器要另想办法。2.3 一个可复用的共享目录批量创建脚本最常见的需求是给一批部门各建一个共享目录设好属主、权限再写进 smb.conf。手工做十个就要半小时脚本化之后一条命令搞定。下面这个脚本接受一个“部门名:用户名”的列表文件自动建目录、建 Samba 用户、追加配置。#!/bin/bash # batch_share.sh - 批量创建 Samba 共享 # 用法: ./batch_share.sh shares.txt set -euo pipefail LIST$1 CONF/etc/samba/smb.conf BACKUP/etc/samba/smb.conf.$(date %s) cp $CONF $BACKUP echo [INFO] 已备份到 $BACKUP while IFS: read -r dept user; do [ -z $dept ] continue dir/srv/share/$dept # 建目录并设权限组内可读写其他人无权限 mkdir -p $dir chown $user:$user $dir chmod 2770 $dir # 建 Samba 用户密码从环境变量读避免明文 if ! pdbedit -L | grep -q ^$user:; then echo -e ${SAMBA_PASS}\n${SAMBA_PASS} | smbpasswd -a -s $user fi # 追加共享段先判断是否已存在 if ! grep -q ^\[$dept\] $CONF; then cat $CONF EOF [$dept] path $dir valid users $user read only no create mask 0660 directory mask 2770 browseable yes EOF fi done $LIST # 校验配置失败就回滚 if ! testparm -s $CONF /dev/null 21; then echo [ERROR] 配置校验失败回滚 mv $BACKUP $CONF exit 1 fi systemctl reload smbd || service smbd reload echo [INFO] 完成已重载 smbd逻辑说明脚本先备份 smb.conf这是血泪经验改坏配置直接回滚比手修快得多。循环里用IFS:按冒号切分列表每行“部门:用户”。目录权限用27702 是 setgid保证目录里新建文件继承父目录组团队协作时不会因为组不对互相看不到。smbpasswd -a -s的-s是从标准输入读密码配合echo -e传两次避免交互。最后testparm校验失败就mv回备份再 reload。参数上create mask和directory mask控制新建文件的权限位valid users限制只有该用户能访问。如果你的场景需要多个用户共享一个目录把valid users改成组名并提前用groupadd建组。列表文件格式如下一行一个dev:zhangsan ops:lisi finance:wangwu跑之前先export SAMBA_PASS你的密码脚本不会把密码写进任何文件。这个脚本在 Jessie 和 Stretch 上都能跑区别只在最后 reload 那行systemd 和 sysvinit 都兼容。3. 配置同步、状态检查与权限导出三个高频脚本拆解3.1 用 rsync 加 testparm 做 smb.conf 多机同步多台文件服务器要保持 smb.conf 一致手工改容易漏。常见做法是用 rsync 推配置但直接推有风险目标机 Samba 版本不同某些参数可能不认。我一般会在推送前先在目标机做一次 dry-run 校验。#!/bin/bash # sync_smbconf.sh - 同步 smb.conf 到多台机器 # 用法: ./sync_smbconf.sh hosts.txt set -euo pipefail SRC/etc/samba/smb.conf HOSTS$1 while read -r host; do [ -z $host ] continue echo [INFO] 同步到 $host # 先推到一个临时文件不直接覆盖 rsync -az $SRC root$host:/tmp/smb.conf.new # 在目标机校验通过才替换 ssh root$host if testparm -s /tmp/smb.conf.new /dev/null 21; then cp /etc/samba/smb.conf /etc/samba/smb.conf.bak mv /tmp/smb.conf.new /etc/samba/smb.conf systemctl reload smbd || service smbd reload echo OK else echo FAIL: 配置校验不通过 rm -f /tmp/smb.conf.new exit 1 fi done $HOSTS逻辑说明不直接覆盖目标机的 smb.conf而是先传到/tmp/smb.conf.new用目标机自己的testparm校验。这一步很关键因为源机和目标机的 Samba 版本可能不同源机能过的配置目标机未必能过。校验通过才备份并替换然后 reload。rsync -az的-a保留权限时间-z压缩传输。ssh那段用单引号包住避免本地变量展开。参数上hosts.txt一行一个主机名或 IP。如果你的环境用非 root 用户做同步把root换掉并确保该用户有 sudo 权限改/etc/samba。这个脚本的边界是它假设所有机器 smb.conf 路径一致如果有的机器配置在/usr/local/samba/etc需要改SRC和目标路径。3.2 服务状态与连接数检查脚本Samba 出问题时第一反应是看服务在不在、有多少连接。smbstatus能列出当前会话和锁但输出很长脚本可以把它压缩成关键指标。#!/bin/bash # check_samba.sh - 检查 Samba 健康状态 set -uo pipefail # 服务状态兼容 systemd 和 sysvinit if systemctl is-active smbd /dev/null 21; then echo [OK] smbd 运行中 (systemd) elif service smbd status /dev/null 21; then echo [OK] smbd 运行中 (sysvinit) else echo [FAIL] smbd 未运行 fi # 监听端口Samba 用 139 和 445 for port in 139 445; do if ss -tlnp | grep -q :$port ; then echo [OK] 端口 $port 监听中 else echo [WARN] 端口 $port 未监听 fi done # 当前会话数 sessions$(smbstatus -b 2/dev/null | tail -n 5 | grep -c . || true) echo [INFO] 当前会话数: $sessions # 检查 passdb 是否可读 if pdbedit -L /dev/null 21; then users$(pdbedit -L | wc -l) echo [INFO] Samba 用户数: $users else echo [FAIL] 无法读取用户数据库 fi逻辑说明先判断 smbd 是否活跃systemd 和 sysvinit 各试一次。然后检查 139/445 端口ss -tlnp比netstat在新系统上更可靠但 Jessie 可能没装iproute2那就换netstat -tlnp。smbstatus -b只列简要会话tail -n 5跳过表头grep -c .数非空行。最后用pdbedit -L验证用户库可读读不到说明 tdbsam 文件权限或路径有问题。参数上smbstatus需要 root 或 samba 组权限才能看到完整信息。如果脚本以普通用户跑会话数可能为 0这是权限问题不是服务问题。这个脚本适合放进 cron每分钟跑一次输出到日志出问题时翻日志比登机器快。3.3 导出共享与权限清单方便审计和迁移迁移或审计时需要一份“哪个共享、什么路径、谁能访问”的清单。testparm -sv能输出所有参数但太啰嗦脚本可以提取关键字段。#!/bin/bash # export_shares.sh - 导出共享清单为 CSV set -euo pipefail OUTshares_$(date %Y%m%d).csv echo share,path,valid_users,read_only $OUT # 用 testparm 输出解析共享段 testparm -s 2/dev/null | awk /^\[/ { share$0; gsub(/[\[\]]/, , share); path; users; ro } /path / { path$3 } /valid users / { $1; $2; users$0; gsub(/^ /, , users) } /read only / { ro$4 } /^$/ share ! share ! global { print share , path , users , ro share } $OUT echo [INFO] 已导出到 $OUT cat $OUT逻辑说明testparm -s输出的是规范化后的配置每个共享段以[名字]开头参数行是key value。awk 按段解析遇到空行且不是 global 段就输出一行 CSV。path取第三个字段valid users去掉前两个字段后剩下的整体read only取第四个字段。这样导出的清单可以直接给审计或做迁移对照。参数上如果某个共享没写valid usersCSV 里该列会是空表示对所有认证用户开放审计时要特别关注。read only为空说明用了默认值Samba 默认是yes但显式写出来更清楚。这个脚本在 Jessie 和 Stretch 上都能跑awk 是 POSIX 的不依赖 gawk 特性。4. 避坑与排查老 Debian 上跑 Samba 4 脚本的五个翻车现场4.1 现象smbpasswd 报 “Failed to add entry for user”原因用户没有先建系统账号。Samba 用户必须对应一个 Linux 系统用户smbpasswd -a不会自动建系统用户。Jessie 和 Stretch 上都是这个行为。解决先useradd -M -s /sbin/nologin 用户名再smbpasswd -a 用户名。脚本里加一步判断id $user不存在就建。注意-s /sbin/nologin防止该用户能登录 shell共享账号不需要登录系统。4.2 现象testparm 校验通过但客户端连不上报 “NT_STATUS_ACCESS_DENIED”原因目录权限或 SELinux/AppArmor 拦截。Debian 默认没开 SELinux但 AppArmor 可能对 smbd 有约束。更常见的是目录权限不对valid users里的用户对path没有执行权限。解决用namei -l /srv/share/dev逐级看权限确保每一级目录该用户都有x。AppArmor 的话看dmesg | grep -i apparmor有拒绝记录就调整/etc/apparmor.d/usr.sbin.smbd或临时aa-complain。脚本里建目录后加一句namei -l $dir输出到日志方便排查。4.3 现象reload smbd 后新共享不生效原因systemctl reload smbd在某些 Samba 版本上只重读部分配置新增共享段可能不生效。Jessie 的 4.2.x 和 Stretch 的 4.5.x 行为略有差异。解决稳妥做法是systemctl restart smbd但会断开现有连接。折中方案是先 reload再用smbclient -L localhost -N列共享看不到就 restart。脚本里可以加判断reload 后等 2 秒列共享缺了就 restart。生产环境尽量在维护窗口做。4.4 现象pdbedit -L 输出为空但 smbpasswd 说用户已存在原因tdbsam 数据库路径不对或者脚本用了-c指定了别的配置。Samba 默认读/etc/samba/smb.conf如果passdb backend被改成tdbsam:/etc/samba/passdb.tdb而实际文件在/var/lib/samba/private就会读空。解决testparm -sv | grep passdb backend确认路径再看该文件是否存在、权限是否 600 且属主 root。脚本里不要硬编码路径用pdbedit -L的实际输出判断读不到就报错退出别继续往下跑。4.5 现象批量脚本跑一半失败smb.conf 被改坏原因脚本没有事务性追加配置到一半失败留下半截 smb.confSamba 起不来。解决开头备份结尾校验失败回滚。上面 2.3 的脚本已经这么做了。另外追加配置时用cat 前先grep -q判断段是否存在避免重复追加导致testparm报重复段。如果并发跑多个脚本改同一个文件加flock锁exec 9/var/lock/samba_script.lock; flock -n 9 || exit 1。5. 进阶用一条命令做配置差异对比与回滚演练老机器上最怕的不是脚本跑失败而是跑失败了不知道怎么回到之前的状态。我习惯在每台机器上留一个“配置快照”目录每次改 smb.conf 前自动存一份带时间戳的副本再用diff做差异对比。下面这条命令组合是我在 Jessie 和 Stretch 上反复用过的。# 快照 差异对比 回滚演练 SNAP_DIR/var/backups/samba mkdir -p $SNAP_DIR # 存快照保留最近 20 份 cp /etc/samba/smb.conf $SNAP_DIR/smb.conf.$(date %Y%m%d%H%M%S) ls -t $SNAP_DIR/smb.conf.* | tail -n 21 | xargs -r rm -f # 对比当前和上一份快照 latest$(ls -t $SNAP_DIR/smb.conf.* | head -1) prev$(ls -t $SNAP_DIR/smb.conf.* | sed -n 2p) if [ -n $prev ]; then echo 与上一份快照的差异 diff -u $prev $latest || true fi # 回滚演练把上一份快照 testparm 校验一遍确认可用 if [ -n $prev ] testparm -s $prev /dev/null 21; then echo [OK] 上一份快照校验通过可回滚 else echo [WARN] 上一份快照校验失败回滚需谨慎 fi逻辑说明快照目录存所有历史版本ls -t按时间倒序tail -n 21跳过前 20 个删掉更早的防止磁盘被撑满。差异对比用diff -u输出统一格式一眼能看出改了哪几行。回滚演练是关键不是真回滚而是拿上一份快照跑testparm确认它本身是合法配置。如果上一份快照都过不了校验真回滚就是从一个坑跳进另一个坑。参数上SNAP_DIR可以换成你习惯的备份路径但别放/tmp重启就没了。保留份数 20 是个经验值smb.conf 通常不大20 份占不了多少空间。diff -u的|| true是因为 diff 在发现差异时返回 1set -e下会退出脚本加|| true让它继续。这套做法我坚持了很多年最大的好处是每次改配置前心里有底改坏了能对比、能回滚、能验证。老 Debian 机器本来就不适合频繁折腾把后悔药提前备好比出事后再救火强得多。如果你也在维护 Jessie 或 Stretch 上的 Samba 4先把快照和校验这两步加进你的脚本里再谈批量操作。希望帮到你。本文还有配套的精品资源点击获取
返回列表