GNU/Linux 基础服务 — Samba

Samba 简述

samba:局域网中一种基于 SMB/CIFS 协议的跨平台的开源文件共享软件套件。其作用有:

  1. 跨操作系统的文件共享
  2. 身份验证与授权
  3. 名称解析
  4. 打印服务

早期的文件共享方式:

  • Windows 的「网上邻居」 – 「网上邻居」使用的协议是 CIFS(Common Internet File System,通用互联网文件系统),虽然名称中带有文件系统,但它本质是一种协议,其依赖 NetBIOS 协议进行通信 。该方式只能在同一个局域网中使用且共享方与访问方都必须是 Windows 系统,无法跨网段与路由。
  • NFS(Network File System) – 设计之初主要用于 GNU/Linux 与 GUN/Linux 之间的文件共享。NFS 的服务器端(共享方)通常部署在类 UNIX 上,Windows 原生不支持作为 NFS 服务器端,但可以通过第三方软件实现;NFS 的访问方(客户端)支持各类平台,但 Windows 访问 GNU/Linux 的 NFS 服务时可能会出现一部分的兼容性问题。

早期由于 Windows 与类 UNIX 之间无法跨系统共享数据,1991 年一位名叫 Andrew Tridgell 的大学生也有这样的困扰,他手上有三台机器:

  • 运行 DOS 的个人计算机
  • DEC 公司的 Digital UNIX 系统
  • Sun 公司的 UNIX 系统

在当时, DEC 公司开发出了一套被称为 PATHWORKS 的软件,这套软件可以用来实现 Digital UNIX 与 DOS 这两个操作系统之间的数据共享,可惜让 Tridgell 觉得较困扰的是,Sun 公司的 UNIX 无法借由这个软件来达到数据分享的目的。为了解决这样的的问题,他决定自己通过逆向工程去抓取 DOS 与 Digital UNIX 系统在进行数据共享/传输时的 SMB 协议流量,最终开发出了 Samba 软件,这套软件能够实现 UNIX 与 DOS 之间的数据共享。

Q:为什么当年不采用 FTP 呢?

FTP 的局限性在于客户端无法直接在服务器端修改数据,即客户端必须从 FTP 服务器上下载文件到客户端本地,修改完毕然后上传到 FTP 服务器端。

Samba 与相关协议:

  • NetBIOS 协议 – IBM 开发的 NetBIOS 协议是为了局域网内少数计算机进行通信的协议,Samba 的早期版本需要使用 NetBIOS 协议
  • SMB (Server Messages Block,信息服务块)协议 – 一种网络文件共享协议,最初由 IBM 的 Barry Feigenbaum 进行开发。

早期局域网内的计算机之间要进行通信,并不是通过 IP 地址,而是通过 MAC 地址实现数据交互,计算机的主机名(NetBIOS 名称)与 MAC 地址之间的映射关系通过 NetBIOS 解析来实现。在现代的局域网中,由于 TCP/IP 分层网络协议中定义了 IP 地址,这时的主机名、IP地址、MAC 地址之间关系如下:

  • 主机名 —> IP 地址 – 通过 DNS 和 NetBIOS 解析完成映射关系
  • IP 地址 —> MAC地址 – 通过 ARP 协议完成映射关系
  • MAC 地址 —> IP 地址 – 通过 RARP 协议完成映射关系

Samba 软件版本 SMB 协议版本

SMB 版本 关键性说明
SMBv1(CIFS) 安全性较低,存在比较严重的漏洞,仅在旧设备兼容性场景下临时启用
SMBv2 重构架构,提升性能与安全性,优化大文件传输效率
SMBv3 在 SMBv2 基础之上进一步提升稳定性、安全性以及性能,安全性上有诸多改进,如消息签名、加密传输、支持更多的加密算法等
Samba 版本 主要特性支持
Samba 3.x SMBv1(CIFS)
Samba 4.0+ SMBv2 和 SMBv1(默认禁用)
Samba 4.3+ SMBv3

RL 8.x 安装 Samba

键入以下命令即可:

Shell > dnf install -y samba samba-client

这将会安装以下相关的依赖包:

  • samba – Samba 的主要软件包
  • avahi-libs – 运行 avahi 所依赖的库,avahi 主要是用来在本地网络中发现设备与主机
  • cups-libs – 运行 CUPS 所依赖的库,CUPS 是管理 UNIX 打印服务相关的这样一个系统
  • libicu – 提供支持 Unicode 字符集的库
  • libnetapi – libnet 的 API 抽象层
  • libwbclient – Samba 套件中的其中一个组成部分,与 Windows 的域环境相关
  • libsmbclient – 包含 SMB 客户端库
  • samba-client-libs – Samba 客户端功能的依赖库
  • samba-common – Samba 公共组件,负责配置管理
  • samba-common-libs – Samba 公共组件所依赖的库
  • samba-common-tools – Samba 公共组件的工具链
  • samba-dcerpc – 通过命名管道为 dcerpc 提供服务
  • samba-ldb-ldap-modules – Samba 中支持 LDAP 的软件包
  • samba-libs – Samba 的库依赖

samba 服务器端的守护进程

  • smbd – 提供对服务器中文件、打印资源的共享访问,端口占用139、445
  • nmbd – 提供主机名称的解析,端口占用137、138

相关文件

Shell > ls -l /etc/samba/
-rw-r--r-- 1 root root    20 Apr 22 16:57 lmhosts
-rw-r--r-- 1 root root   940 Apr 22 16:57 smb.conf
-rw-r--r-- 1 root root 11319 Apr 22 16:57 smb.conf.example
  1. smb.conf – 配置文件
  2. lmhosts – 定义局域网中 IP 地址与主机名的映射文件。通常而言,当 Samba 服务器端启动相关守护进程后,会自动扫描局域网当中所有的主机名,但是扫描会消耗掉一部分的资源,如果觉得扫描慢,可以将 IP 地址和主机名手工对应起来,省略搜索过程,节省时间。请不要与 /etc/hosts 文件混淆。
  3. /etc/samba/smbpasswd – SMB 密码保存文件,默认不存在。
  4. /etc/samba/smbusers – 定义用户别名或者说用户名映射,用于适应不同操作系统中的用户名习惯。比如写入 root = administrator admin,这样就可以用 administrator 或 admin这两个用户来代替 root 登陆 Samba 服务器,更贴近 Windows 用户的使用习惯。需要在 /etc/samba/smb.conf 配置文件中加入 username map = /etc/samba/smbusers 参数
  5. smb.conf.example – 配置文件的参数示例以及说明

相关命令

testparm – 检测 /etc/samba/smb.conf 配置文件是否正确。直接键入该命令且回车后会显示配置文件当中实际生效的内容。

smbclient – 该命令由软件包 samba-client 释放出来,其常用选项有:

  • -L <IP> – 查看指定主机共享资源的情况
  • -U <user> – 指定用户,如果访问的共享文件夹需要身份验证
  • -N – 以游客身份进行访问,不需要交互密码
  • -c "<SAMBA-COMMAND>" – 在 Shell 命令行交互中键入 samba 命令行操作。如 smblicent -N //192.168.100.20/public -c "get test.txt"

smbpasswd – 用来给操作系统中的用户设置 Samba 密码,选项有:

  • -a <user> – 将系统用户添加到 Samba 中并设置 Samba 密码
  • -x <user> – 从 Samba 中删除用户

pdbedit – 操作 Samba 用户,选项有:

  • -L – 查阅具有 Samba 密码的用户
  • -x <user> – 删除 Samba 用户
  • -a -u <user> – 将系统用户添加到 Samba 中

Samba 中的登录用户与密码

默认情况下,Samba 的登录需要使用到操作系统中的用户,但其密码则是使用单独的 Samba 密码。

配置文件说明

Shell > cat /etc/samba/smb.conf
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.
#
# Note:
# SMB1 is disabled by default. This means clients without support for SMB2 or
# SMB3 are no longer able to connect to smbd (by default).

[global]
        workgroup = SAMBA
        security = user

        passdb backend = tdbsam

        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw

        # Install samba-usershares package for support
        include = /etc/samba/usershares.conf

[homes]
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

[printers]
        comment = All Printers
        path = /var/tmp
        printable = Yes
        create mask = 0600
        browseable = No

[print$]
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = @printadmin root
        force group = @printadmin
        create mask = 0664
        directory mask = 0775

格式说明:

  • 以 "#" 开头或 ";" 开头的行表示注释行

  • global 标题,使用 "[" 和 "]" 包含,表示 Samba 的全局配置,标题的下面则是具体的配置项

  • 除 global 标题外的其他标题表示共享设置,初始有三个,即

    • homes 标题 – 用户目录共享设置,针对任意用户生效的配置。
    • printers 标题 – 打印机共享设置
    • print$ 标题 – 打印机驱动
  • 配置项的格式为 name = value

全局配置

  • workgroup = SAMBA – 指定工作组。Windows 中默认所有主机的工作组为 「WORKGROUP」,在 Windows10 的 「网络」中,如果所有人都加入到了默认的工作组中,则会直接显示主机名。如果局域网中存在多个工作组,则是先显示工作组,工作组下面包含各个主机名。工作组的目的就是为了方便管理。

  • security = user – security 是 Samba 中最重要的设置之一,用于定义 Samba 服务器的认证机制,控制客户端访问共享资源时的身份验证方式

    • user – 要求客户端提供用户名和密码进行本地验证
    • domain – 由域控制器提供认证
    • share – 不需要密码就可以访问,相当于 Windows 共享目录时开启 guest 用户,已经被弃用
  • passdb backend = tdbsam – 选择哪种后端来存储用户信息以及可能的组信息。

    • tdbsam – 采用本地 TDB 文件存储用户以及相关信息
    • smbpasswd – 传统的明文格式文件(/etc/samba/smbpasswd)来存储密码
    • ldapsam – 通过 LDAP 目录来存储用户信息,适用于企业级环境
  • printing = cups – 用于定义打印系统的类型,其值有:

    • bsd
    • aix
    • lprng
    • plp
    • sysv
    • hpux
    • qnx
    • softq
    • cup
    • iprint
  • printcap name = cups – 用于指定打印机配置文件的路径或类型

  • load printers = yes – 控制默认情况下是否加载 printcap 中的所有打印机以进行浏览

  • cups options = raw – 用于指定将打印任务提交给 cups 打印系统时的附加选项。raw 表示直接传递原始的打印数据,不经过 CUPS 的过滤与转换

  • include = /etc/samba/usershares.conf – 包含其他配置文件的内容,拆分配置文件后更加容易维护

  • netbios name = MYSERVER – 设置 Samba 服务器的 NetBIOS 名称,以实现基于 NetBIOS 协议的网络标识和服务发现。需要注意名称不要把超过 15 个字符

  • server string = Samba Server Version %v – Samba 服务器的名称,%v 是一个变量,用来显示 Samba 的版本

  • interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24 – 设置监听的网络接口以及 IP 地址

  • hosts allow = 127. 192.168.12. 192.168.13. – 运行访问 Samba 服务器的主机

  • log file = /var/log/samba/log.%m – 日志文件路径,%m 是一个变量,表示客户端的主机名

  • max log size = 50 – 指定日志文件的最大大小,以 KB 为单位。若超过了指定的大小,则会重命名文件并添加 .old 后缀名。

  • map to guest = nerver – 定义如何处理无效用户的登录请求

    • nerver – 拒绝所有使用无效密码的用户登录请求
    • bad user – 仅当用户名不存在时,则会将用户名映射为 nobody。若用户名存在但密码错误,仍拒绝访问
    • bad password – 用户名存在但密码错误时,仍然允许以游客身份访问
    • bad uid – 当有 ad 域且 security = domain 或者 security = ads ,才开启这项参数。

共享设置

  • comment = Home Directories – 共享文件夹的说明
  • path = /var/spool/samba – 指定共享的文件夹
  • guest ok = no – 是否允许无密码访问共享目录,相当于 security = share
  • read only = yes – 如果为 no,表示允许在共享目录中创建和修改文件
  • writeable = yes – 是否允许在共享目录中创建或修改文件。在同一个共享目录的设置中,read onlywriteable 只能出现一次。若两个配置项都写入,则谁写在文件内容的最后面,谁就是生效的
  • write list = +staff – 拥有写权限的用户列表或组列表,多个用户或组用逗号隔开,组需要有 "@" 前缀。假设 guest ok = yespath = /var/spool/sambawriteable = yes,这表示所有的人都能访问目录且所有人可写。如果添加了 wrtite list,那么只有这些用户列表可写,而其他人仅只读。
  • browseable = no – 共享目录对于客户端而言是否可见。设置为 no,客户端没办法直接看见共享目录但可以手动加上共享路径进行访问
  • valid users = %S, %D%w%S – 允许登录 Samba 服务器的用户列表或组列表,多个用户或组用逗号隔开,组需要有 "@" 前缀。若列表为空,则表示任何用户都可以登录。
  • inherit acls = yes – 用于控制访问控制列表(ACL)继承行为。当设置为 yes 时,新创建的‌文件/目录‌会自动继承父目录的 ACL 权限规则,从而无需手动为每个子项设置 ACL

通常而言,共享设置是需要管理员来手动配置的。

常见变量

  • %v – Samba 服务器的版本号
  • %S – 目录的共享名称
  • %m – 客户端机器的主机名(NetBIOS 名称)
  • %L – 服务器端的主机名(NetBIOS 名称)
  • %u – 当前登录用户的名称
  • %g – 当前登录用户的主组名
  • %D – 当前用户的域或工作组的名称
  • %w – winbind 分隔符

Samba 的基本使用

游客访问

所谓游客访问,即任何用户都会被映射为 GNU/Linux 上的 nobody 用户,相当于不需要密码就访问 Samba 服务器。

明确权限:

  • 任何用户都可以自由访问共享目录
  • 任何用户都可写
  • 共享目录对所有用户都可见
# 新建要共享的目录
Shell > mkdir /samba-pub/

Shell > vim /etc/samba/smb.conf
[global]
        workgroup = SAMBA
        server string = Samba Server %v
        log file = /var/log/samba/log.%m
        max log size = 50

        security = user
        map to guest = bad user

        passdb backend = tdbsam

[public]
        comment = samba test
        path = /samba-pub/
        browseable = yes
        writable = yes
        guest ok = yes

# 因为任何用户都会映射为 nobody,要让 nobody 拥有 w 权限,需要改变共享文件夹的所有者以及权限
## 能否有写权限,不仅要让服务的权限允许(writable = yes),文件的权限也需要允许(w)
Shell > chown nobody:root /samba-pub/
Shell > chmod u+w /samba-pub/
Shell > ls -ld /samba-pub/
drwxr-xr-x 2 nobody root 4096 May  9 14:22 /samba-pub/

# 测试配置文件语法
Shell > testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
...

Shell > systemctl start smb.service nmb.service

# 查阅端口占用
## 137、138、139、445
Shell > ss -tulnp
Netid   State    Recv-Q   Send-Q       Local Address:Port       Peer Address:Port   Process
udp     UNCONN   0        0          192.168.100.255:137             0.0.0.0:*       users:(("nmbd",pid=2200,fd=17))
udp     UNCONN   0        0           192.168.100.20:137             0.0.0.0:*       users:(("nmbd",pid=2200,fd=16))
udp     UNCONN   0        0                  0.0.0.0:137             0.0.0.0:*       users:(("nmbd",pid=2200,fd=14))
udp     UNCONN   0        0          192.168.100.255:138             0.0.0.0:*       users:(("nmbd",pid=2200,fd=19))
udp     UNCONN   0        0           192.168.100.20:138             0.0.0.0:*       users:(("nmbd",pid=2200,fd=18))
udp     UNCONN   0        0                  0.0.0.0:138             0.0.0.0:*       users:(("nmbd",pid=2200,fd=15))
udp     UNCONN   0        0                127.0.0.1:323             0.0.0.0:*       users:(("chronyd",pid=730,fd=5))
udp     UNCONN   0        0                    [::1]:323                [::]:*       users:(("chronyd",pid=730,fd=6))
tcp     LISTEN   0        50                 0.0.0.0:139             0.0.0.0:*       users:(("smbd",pid=2199,fd=32))
tcp     LISTEN   0        128                0.0.0.0:22              0.0.0.0:*       users:(("sshd",pid=741,fd=3))
tcp     LISTEN   0        50                 0.0.0.0:445             0.0.0.0:*       users:(("smbd",pid=2199,fd=31))
tcp     LISTEN   0        50                    [::]:139                [::]:*       users:(("smbd",pid=2199,fd=30))
tcp     LISTEN   0        128                   [::]:22                 [::]:*       users:(("sshd",pid=741,fd=4))
tcp     LISTEN   0        50                    [::]:445                [::]:*       users:(("smbd",pid=2199,fd=29))

# 写入文本内容到一个文件
Shell > echo "hello! world" >> /samba-pub/test.txt

客户端使用的是 Windows 10 的 PowerShell:

# 仅浏览共享
## 这里没有弹出身份认证的窗口
PS > cd \\192.168.100.20\public

PS > ls

    Directory: \\192.168.100.20\public

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-----            2025/5/9    14:40             13 test.txt

# 在共享目录中新创建文件
PS > echo "2025-05-09" > .\client-file.txt

PS > ls

    Directory: \\192.168.100.20\public

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---            2025/5/9    14:52             12 client-file.txt
-----            2025/5/9    14:40             13 test.txt

# 在 Samba 服务器端浏览该文件的权限情况,确定是映射为 nobody
Shell > ls -l /samba-pub/client-file.txt
-rwxr--r-- 1 nobody nobody 12 May  9 14:52 /samba-pub/client-file.txt

Samba 客户端

  1. Windows 图形化操作

    Windows + r 两个按键唤出「运行」窗口,键入您的共享路径即可,例如 \\192.168.100.20\\\192.168.100.20\public

  2. Windows 命令行操作

    在 PowerShell 中直接使用 cdstart 命令即可

    # cd 命令适合不需要密码交互的文件共享
    PS > cd \\192.168.100.20\public
    
    # start 命令适合有密码交互的文件共享,这会弹出登录窗口。注意 start 命令后面是主机的 IP 地址
    PS > start \\192.168.100.20
小提示
若您需要移除 Windows 当中的 Samba 身份认证缓存,请在 cmd 下执行 net use * /delete,或者在 PowerShell(非管理员) 中执行 net use * /delete
  1. GNU/Linux 客户端

    # 这里会提示你输入密码,直接键入回车跳过即可
    ## 在命令行中加入 -N 选项可跳过密码交互
    Fedora > smbclient -L //192.168.100.20
    Password for [SAMBA\root]:
    
            Sharename       Type      Comment
            ---------       ----      -------
            public          Disk      samba test
            IPC$            IPC       IPC Service (Samba Server 4.19.4)
    SMB1 disabled -- no workgroup available
    
    Fedora > smbclient //192.168.100.20/public
    Password for [SAMBA\root]:
    Try "help" to get a list of possible commands.
    smb: \> ls
    .                                   D        0  Fri May  9 14:52:18 2025
    ..                                  D        0  Fri May  9 14:52:18 2025
    client-file.txt                     A       12  Fri May  9 14:52:18 2025
    test.txt                            N       13  Fri May  9 14:40:14 2025
    
                    48193236 blocks of size 1024. 43202460 blocks available

    Samba 命令行客户端 与 FTP 命令行客户端类似,常用有:

    • get – 下载文件(不支持目录),smbclient 命令在何处路径运行则下载到那个路径下
    • put – 上传文件(不支持目录)
    • rename – 文件改名,支持对目录的改名
    • del – 删除文件
    • mkdir – 创建目录
    • rmdir – 删除目录
    • cd – 切换工作目录
    • quit – 退出 samba 命令行客户端

用户级别访问

这里演示使用操作系统中的用户以及 Samba 密码对 Samba 服务器进行访问。

Shell > vim /etc/samba/smb.conf
[global]
        workgroup = SAMBA
        server string = Samba Server %v
        log file = /var/log/samba/log.%m
        max log size = 50

        security = user

#       map to guest = bad user

        passdb backend = tdbsam

[homes]
        comment = home dir
        browseable = no
        writable = yes

[public]
        comment = samba test
        path = /samba-pub/
        browseable = yes
        writable = yes
        write list = pubtest
        valid users = pubtest

Shell > useradd pubtest
Shell > passwd pubtest

# 变更所有者以及所有者的权限
Shell > chown pubtest:root /samba-pub/
Shell > chmod u+w /samba-pub/

Shell > ls -ld /samba-pub/
drwxr-xr-x 2 pubtest root 4096 May  9 15:30 /samba-pub/

# 设置 Samba 密码
Shell > smbpasswd -a pubtest
New SMB password:
Retype new SMB password:
Added user pubtest.

# 测试配置文件
Shell > testparm

Shell > systemctl restart smb.service nmb.service

使用 Windows 的 PowerShell 进行测试:

PS > start \\192.168.100.20

# 弹出窗口,键入对应的用户以及 Samba 密码即可

界面如下:

如您所见,用户的家目录不可见,您可以在地址栏手动加入路径 —— \\192.168.100.20\pubtest

对于新文件或目录,无论是用户的家目录还是共享目录,其上传、下载、重命名、修改文件内容等功能均无问题,若共享目录中存在以前的文件,pubtest 用户可能没有权限操作,您需要在 Samba 服务器那边查阅文件的权限然后执行相应的修改即可。

Q:如果现在新创建用户,能否访问 Samba 服务器的 public 目录?

不能,因为 public 共享目录只允许了 pubtest 用户登录(valid users = pubtest)。假设您现在需要 frank 用户登录到该目录且拥有 w 权限:

Shell > useradd frank

Shell > passwd frank

Shell > smbpasswd -a frank

Shell > pdbedit -L
pubtest:1000:
frank:1001:

Shell > vim /etc/samba/smb.conf
[global]
        workgroup = SAMBA
        server string = Samba Server %v
        log file = /var/log/samba/log.%m
        max log size = 50

        security = user

        passdb backend = tdbsam

[homes]
        comment = home dir
        browseable = no
        writable = yes

[public]
        comment = samba test
        path = /samba-pub/
        browseable = yes
        writable = yes
        write list = pubtest,frank
        valid users = pubtest,frank

Shell > systemctl restart smb.service nmb.service

另外一边,文件权限也需要正确,这样才能保证 frank 用户对该共享目录是可写的:

Shell > chown pubtest:pubtest /samba-pub/
Shell > chmod 775 /samba-pub/

# 将 frank 用户加入到 pubtest 组中,此时 pubtest 组即 frank 用户的附加组
Shell > gpasswd -a frank pubtest
Adding user frank to group pubtest

Shell > id frank
uid=1001(frank) gid=1001(frank) groups=1001(frank),1000(pubtest)

经过测试,证明 frank 对该共享目录确实有 w 权限。

Samba 用户管理

前面我们将 pubtest 和 frank 用户添加到了 Samba 服务器中,且这两个用户都有密码。现在我们需要将 Samba 中的这两个用户删除:

Shell > pdbedit -L
pubtest:1000:
frank:1001:

Shell > smbpasswd -x pubtest

Shell > smbpasswd -x frank

Shell > vim /etc/samba/smb.conf
[global]
        workgroup = SAMBA
        server string = Samba Server %v
        log file = /var/log/samba/log.%m
        max log size = 50

        security = user

        passdb backend = tdbsam

[homes]
        comment = home dir
        browseable = no
        writable = yes

[public]
        comment = samba test
        path = /samba-pub/
        browseable = yes
        writable = yes

Shell > systemctl restart smb.service nmb.service

复杂权限设置

在实际的企业环境中,需要有更加复杂的权限设置,单靠 Samba 配置文件中的简单权限控制是做不到的。试想下在企业环境中,共享目录众多、用户众多、权限交叉,那怎么办呢?使用 GNU/Linux 的 ACL 权限。

ACL (Access Control List,访问控制列表),其目的是为了解决 GNU/Linux 下三种身份(u、g、o)不能满足资源权限分配的问题。具体的配置思路就是先把共享目录配置好,不论有多少数量的共享目录,先按照下面的模板写入到配置文件:

[public]
        comment = public dir
        path = /public/
        browseable = yes
        writeable = yes

[net]
        comment = network dir
        path = /net/
        browseable = yes
        writeable = yes

接着对每一个单独的用户设置 ACL 权限,比如针对 public 共享目录, tom 用户需要有读写权限,而 jack 只能读取该目录的文件:

Shell > setfacl -m u:tom:rwx /public/

Shell > setfacl -m u:jack:rx /public/

具体操作细节如下:

# 先将前面的演示环境删除
Shell > rm -rf /samba-pub/

Shell > gpasswd -d frank pubtest

Shell > userdel -r pubtest ; userdel -r frank

# 开始操作
Shell > mkdir /public/

Shell > vim /etc/samba/smb.conf
[global]
        workgroup = SAMBA
        server string = Samba Server %v
        log file = /var/log/samba/log.%m
        max log size = 50

        security = user

        passdb backend = tdbsam

[homes]
        comment = home dir
        browseable = no
        writable = yes

[public]
        comment = public dir
        path = /public/
        browseable = yes
        writable = yes

Shell > testparm

Shell > systemctl restart smb.service nmb.service

# 添加操作系统用户 tom 并将用户添加到 Samba 中
Shell > useradd tom
Shell > passwd tom
Shell > smbpasswd -a tom

# 添加操作系统用户 jack 并将用户添加到 Samba 中
Shell > useradd jack
Shell > passwd jack
Shell > smbpasswd -a jack

Shell > pdbedit -L
tom:1000:
jack:1001:

# 设置 ACL 权限
Shell > setfacl -m u:tom:rwx /public/
Shell > setfacl -m u:jack:rx /public/

# "+" 表示 ACL 权限
Shell > ls -ld /public/
drwxrwxr-x+ 2 root root 4096 May 10 13:42 /public/

Shell > getfacl /public/
getfacl: Removing leading '/' from absolute path names
# file: public/
# owner: root
# group: root
user::rwx
user:tom:rwx
user:jack:r-x
group::r-x
mask::rwx
other::r-x

使用 Windows 客户端测试成功,针对该共享目录,tom 用户确实有读写权限,而 jack 仅有读权限。

挂载(Windows 当中称为映射网络驱动器)

在前面的文字中,我们介绍了 GNU/Linux 的命令行客户端 smbclient,这种命令行方式只是临时使用 Samba,若您需要长期使用 Samba 的共享资源,则需要进行挂载,例如:

# 将共享目录 public 挂载到本地的 /samba-public/ 目录中,请注意!这只是临时挂载
## -t 指定文件系统,-o 指定挂载的选项,username 指定登录的用户
Fedora > mkdir /samba-public
Fedora > mount -t cifs -o username=tom //192.168.100.20/public /samba-public
Password for tom@//192.168.100.20/public:

Fedora > df -hT
Filesystem              Type      Size  Used Avail Use% Mounted on
...
//192.168.100.20/public cifs       46G  4.8G   42G  11% /samba-public

# 进入到挂载的目录中即操作共享目录
Fedora > cd /samba-public/ ; ls -l

# 卸载,卸载时请注意工作目录不要在 /samba-public/ 中
Fedora > umount /samba-public

Fedora > df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
...

若您需要让挂载永久生效,则需要写入到 /etc/fstab 中,例如:

//192.168.100.20/public /samba-public cifs defaults,username=tom,password=Google404  1 2

针对 Windows 客户端,GNU/Linux 的挂载操作在 Windows 中称为 「映射网络驱动器」,需要挂载到具体的盘符:

用户别名

GNU/Linux的用户如 root、nobody 在 Windows 中对应的是 administrator、guest 用户,Samba 本身是跨平台的,为了照顾在不同操作系统的使用习惯,于是当初开发的时候想到了用户别名。

需要在 /etc/samba/smb.conf 配置文件中加入 username map = /etc/samba/smbusers 参数,smbusers 文件需要手动创建,其内容格式示例:

root = administrator admin

这样就可以用 administrator 或 admin 这两个用户来代替 root 登陆 Samba Server,更贴近 Windows 平台的使用习惯。

Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇