Henry
发布于 2025-10-12 / 3 阅读
0
0

Samba - Docker 部署 - Basic Authenticated

背景简介

简易部署 samba 共享服务。

前置信息

  1. 系统:ubuntu 22.04
  2. Docker 28.2.2
  3. Samba guest 部署参考 【Samba - Docker 部署 - guest

详细步骤

第一步: 确保 Samba 镜像可用。

第二步: 创建 Docker 容器

#!/usr/bin/expect
# do nothing 
  • 准备 Dockerfile 配置文件
# 使用指定 ubuntu 镜像
FROM ubuntu:noble-20250529

# 设置环境变量,避免交互提示
ENV DEBIAN_FRONTEND=noninteractive

# 更新软件源并安装 Samba
RUN apt-get update && apt-get install -y acl attr samba winbind libpam-winbind libnss-winbind krb5-config krb5-user dnsutils python3-setproctitle chrony expect supervisor && rm -rf /var/lib/apt/lists/*

# 暴露 Samba 使用的端口
EXPOSE 139 445

# 复制自定义的 smb.conf 配置文件到容器中
COPY smb.conf /etc/samba/smb.conf

# 复制 supervisord 配置文件
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# Copy initialize shell script
COPY initialize.sh /shell/initialize.sh

# 启动 supervisord
CMD /bin/sh -c "/shell/initialize.sh && /usr/bin/supervisord -n"
  • 生成 Docker 镜像
$ docker build -t pers/samba:2.0.0 .

第三步: 准备真实配置文件

  • 准备初始化脚本
    • 创建组
    • 创建用户
    • 添加用户至 Samba
#!/usr/bin/expect

set USERNAME "user"
set PASSWORD "password"
set GROUPNAME "group"

# Check if private group exists
puts "\nCheck if $GROUPNAME exists"
spawn getent group $GROUPNAME
expect eof
# the fourth element is exit code, index start with 0
set STATUS_1 [lindex [wait] 3]

if { $STATUS_1 == 0} {
    puts "\nGroup $GROUPNAME exists, skip create group step"
} else {
    puts "\nGroup $GROUPNAME not exists, start creating..."
    spawn groupadd $GROUPNAME
    expect eof
    set STATUS_2 [lindex [wait] 3]
    if { $STATUS_2 ==0 } {
        puts "Success: Create group $GROUPNAME success"
    } else {
        puts "Error: Create group $GROUPNAME failed"
        exit 1
    }
}

# check if user exists
spawn getent passwd $USERNAME
expect eof
set STATUS_3 [lindex [wait] 3]
if { $STATUS_3 == 0} {
    puts "User $USERNAME exists, skip create user step"
} else {
    puts "User $USERNAME not exists, start creating..."
    spawn useradd -m -s /sbin/nologin -g $GROUPNAME $USERNAME
    expect eof
    set STATUS_4 [lindex [wait] 3]
    if { $STATUS_4 == 0 } {
        puts "Success: User $USERNAME added and add to group $GROUPNAME success"
    } else {
        puts "Error: User $USERNAME added and add to group $GROUPNAME failed"
        exit 1
    }

}

# Add user to samba database
# check if smbpasswd command exists
if { ![file exists "/usr/bin/smbpasswd"] } {
    puts "Error: smbpasswd not found,please install Samba first"
    exit 1
}

# Add user to samba
puts "Add user $USERNAME to Samba..."

spawn smbpasswd -a $USERNAME
expect {
    "New SMB password:" {
        send "$PASSWORD\n"
        expect {
            "Retype new SMB password:" {
                send "$PASSWORD\n"
                expect eof
                set STATUS_5 [lindex [wait] 3]
                if { $STATUS_5 == 0 } {
                    puts "Success: Samba user $USERNAME added/modified success"
                } else {
                    puts "Error: Samba user $USERNAME added/modified failed"
                    exit 1
                }
            }
            timeout {
                puts "Error: Input password timeout"
                exit 1
            }
            default {
                puts "Error: Unknown error"
                exit 1
            }
        }
    }
    timeout {
        puts "Error: Add user to Samba timeout"
        exit 1
    }
    default {
        puts "Error: Unknown error"
        exit 1
    }
}
  • 准备 Basic Authenticated smb.conf 配置文件
[global]
        log file = /var/log/samba/%m
        log level = 3
        server role = standalone server
        workgroup = WORKGROUP
        security = user
        passdb backend = tdbsam
        map to guest = never
        server string = Samba Server Version %v
        server min protocol = SMB3
        server max protocol = SMB3
        disable netbios = yes
        smb ports = 445

[Common]
        # This share requires authentication to access
        path = /sdd/SambaShared/Common
        read only = no
        # inherit permissions = yes
        browseable = yes
        writable = yes
        valid users = @DockerSamba
  • 创建文件夹
$ sudo mkdir /sdd/SambaShared/Common
  • 修改文件夹权限
$ sudo chmod 770 /sdd/SambaShared/Common

第四步: 启动 Samba 服务

  • 准备 docker-compose.yaml 配置文件
services:
  samba:
    image: pers/samba:2.0.0
    container_name: samba
    restart: always
    ports:
      - "445:445"
    volumes:
      - ./data/conf/smb.conf:/etc/samba/smb.conf:ro
      - ./data/var/log/supervisor:/var/log/supervisor
      - /sdd/SambaShared:/sdd/SambaShared
      - ./data/var/log/samba:/var/log/samba
      - ./data/shell:/shell:ro
      - /etc/localtime:/etc/localtime:ro
  • 启动容器
$ docker compose up -d
  • 查看容器状态
$ docker logs -f --tail 5 samba
2025-06-19 17:26:57,047 INFO RPC interface 'supervisor' initialized
2025-06-19 17:26:57,048 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2025-06-19 17:26:57,048 INFO supervisord started with pid 37
2025-06-19 17:26:58,051 INFO spawned: 'smbd' with pid 38
2025-06-19 17:27:03,132 INFO success: smbd entered RUNNING state, process has stayed up for > than 5 seconds (startsecs)

第五步: 连接 Samba

  • Windows
    • 添加路径: This PC → Map network drive… → 输入共享路径 → Finish → 输入账号密码 → OK

  • Ubuntu
    • 安装 cifs-utils

      $ sudo apt install cifs-utils
      
    • 挂载 samba 共享目录,确保 /mnt/test 文件夹已创建

      $ sudo mount -t cifs //127.0.0.1/Common /mnt/test -o username=your_name,password=your_password
      

以上便是本文的全部内容,感谢您的阅读,如遇到任何问题,欢迎在评论区留言讨论。



评论