实用脚本能自动管理SMB服务吗?

wen 实用脚本 2

本文目录导读:

实用脚本能自动管理SMB服务吗?

  1. Linux 环境 (使用 systemctl 和 bash)
  2. Windows 环境 (PowerShell)
  3. 高级自动化 (Ansible)
  4. 注意事项

是的,可以通过实用脚本自动管理SMB服务,根据你的需求(如启动/停止/重启、检查状态、定期维护或配置共享),可以编写Shell脚本、PowerShell脚本或使用Ansible等工具实现自动化。

以下给出几个常见场景的实用脚本示例:

Linux 环境 (使用 systemctl 和 bash)

基本管理脚本 (start_stop_smb.sh)

#!/bin/bash
# 功能:启动、停止、重启、检查 SMB 服务 (smbd)
SMB_SERVICE="smbd"
ACTION=$1
case $ACTION in
    start)
        echo "正在启动 SMB 服务..."
        sudo systemctl start $SMB_SERVICE
        echo "启动完成"
        ;;
    stop)
        echo "正在停止 SMB 服务..."
        sudo systemctl stop $SMB_SERVICE
        echo "停止完成"
        ;;
    restart)
        echo "正在重启 SMB 服务..."
        sudo systemctl restart $SMB_SERVICE
        echo "重启完成"
        ;;
    status)
        sudo systemctl status $SMB_SERVICE
        ;;
    enable-at-boot)
        sudo systemctl enable $SMB_SERVICE
        echo "已设置开机自启"
        ;;
    *)
        echo "用法: $0 {start|stop|restart|status|enable-at-boot}"
        exit 1
        ;;
esac

定期检查并自动重启脚本 (smb_health_check.sh)

#!/bin/bash
# 功能:检查 SMB 服务是否运行,若停止则自动重启并记录日志
SMB_SERVICE="smbd"
LOG_FILE="/var/log/smb_health.log"
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
if systemctl is-active --quiet $SMB_SERVICE; then
    echo "$TIMESTAMP SMB 服务运行正常" >> $LOG_FILE
else
    echo "$TIMESTAMP 警告: SMB 服务未运行,正在尝试重启..." >> $LOG_FILE
    sudo systemctl start $SMB_SERVICE
    if [ $? -eq 0 ]; then
        echo "$TIMESTAMP 重启成功" >> $LOG_FILE
        # 可选:发送告警通知(邮件、Slack等)
    else
        echo "$TIMESTAMP 重启失败,请手动检查" >> $LOG_FILE
    fi
fi

配合 cron 使用:*/5 * * * * /path/to/smb_health_check.sh

批量添加共享目录脚本 (add_smb_share.sh)

#!/bin/bash
# 功能:自动向 smb.conf 添加新的共享配置
SMB_CONF="/etc/samba/smb.conf"
SHARE_NAME=$1
SHARE_PATH=$2
if [ -z "$SHARE_NAME" ] || [ -z "$SHARE_PATH" ]; then
    echo "用法: $0 [共享名] [路径]"
    exit 1
fi
# 检查路径是否存在
if [ ! -d "$SHARE_PATH" ]; then
    echo "错误: 路径 $SHARE_PATH 不存在"
    exit 1
fi
# 追加共享配置(示例为简单公开共享,生产环境请按需调整权限)
echo "
[$SHARE_NAME]
   path = $SHARE_PATH
   browseable = yes
   read only = no
   guest ok = yes
" | sudo tee -a $SMB_CONF
# 重启服务使配置生效
sudo systemctl restart smbd
echo "共享 $SHARE_NAME 已添加并生效"

Windows 环境 (PowerShell)

管理脚本 (Manage-SMBService.ps1)

param(
    [ValidateSet("Start", "Stop", "Restart", "Status")]
    [string]$Action
)
$serviceName = "LanmanServer"
switch ($Action) {
    "Start" {
        Write-Host "正在启动 SMB 服务..."
        Start-Service -Name $serviceName
        Write-Host "启动完成"
    }
    "Stop" {
        Write-Host "正在停止 SMB 服务..."
        Stop-Service -Name $serviceName -Force
        Write-Host "停止完成"
    }
    "Restart" {
        Write-Host "正在重启 SMB 服务..."
        Restart-Service -Name $serviceName -Force
        Write-Host "重启完成"
    }
    "Status" {
        Get-Service -Name $serviceName | 
            Select-Object Name, Status, StartType
    }
}

自动修复脚本 (AutoRepair-SMB.ps1)

# 每隔5分钟检查 SMB 服务状态,若停止则自动重启
while ($true) {
    $service = Get-Service -Name "LanmanServer" -ErrorAction SilentlyContinue
    if ($service.Status -ne "Running") {
        Write-Host "$(Get-Date) SMB 服务已停止,尝试重启..." -ForegroundColor Yellow
        Start-Service -Name "LanmanServer"
        # 可选:记录事件日志或发送邮件
    }
    Start-Sleep -Seconds 300
}

高级自动化 (Ansible)

使用 Ansible Playbook 实现跨平台管理:

---
- name: 管理 SMB 服务
  hosts: smb_servers
  tasks:
    - name: 确保 SMB 服务运行 (Linux)
      systemd:
        name: smbd
        state: started
        enabled: yes
      when: ansible_os_family == "Debian" or ansible_os_family == "RedHat"
    - name: 确保 SMB 服务运行 (Windows)
      win_service:
        name: LanmanServer
        state: started
        start_mode: auto
      when: ansible_os_family == "Windows"

注意事项

  1. 权限:脚本中可能包含 sudo 或管理员权限,确保执行时有对应权限。
  2. 服务名差异:Linux不同发行版服务名可能是 smbsmbdsamba,需根据实际调整。
  3. 配置备份:修改 smb.conf 前建议先备份:cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
  4. 日志记录:生产环境建议将关键操作记录到 syslog 或自定义日志文件。
  5. 安全:如果脚本涉及远程管理,建议使用 SSH 密钥认证,避免硬编码密码。

你可以根据实际环境选择合适的脚本,并调整其中的服务名、路径、权限等参数,如果需要针对特定场景(如 Docker 容器中的 SMB、防火墙规则联动等),可以提供更多细节来定制脚本。

抱歉,评论功能暂时关闭!