Samba是SMB/CIFS网络文件共享协议的开源实现,该协议允许终端用户访问文件,打印机和其他共享资源。

本教程介绍如何在Ubuntu 18.04安装和配置Samba,使你的计算机可以通过网络在不同操作系统之间提供文件共享。

我们将创建用户,sadmin具有对所有共享的读写访问权限的管理用户。josh具有自己的私有文件共享的普通用户。

我们将创建共享,users所有用户都可以读取/写入此共享。josh此共享可以仅由josh和sadmin用户读取/写入。

文件可以被在网络的所有设备访问。在本教程的最后,我们还将说明如何在Linux,Windows和macOS客户端连接到Samba服务器的详细说明。

在继续之前,请确保您以个具有sudo权限的用户登录到Ubuntu 18.04。

安装 Samba服务器

Samba可从Ubuntu官方软件源获得。要在Ubuntu 18.04安装Samba,请运行命令sudo apt update && sudo apt install samba更新apt软件包索引并安装Samba。

安装完成后,Samba服务将自动启动。要检查Samba服务器是否正运行,请运行命令sudo systemctl status nmbd。至此,你已经在Ubuntu 18.04安装Samba。

sudo apt update
sudo apt install samba
sudo systemctl status nmbd
● nmbd.service - Samba NMB Daemon
Loaded: loaded (/lib/systemd/system/nmbd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2019-01-27 02:36:20 PST; 4s ago
    Docs: man:nmbd(8)
        man:samba(7)
        man:smb.conf(5)
Main PID: 4262 (nmbd)
Status: "nmbd: ready to serve connections..."
    Tasks: 1 (limit: 2319)
CGroup: /system.slice/nmbd.service
        `-4262 /usr/sbin/nmbd --foreground --no-process-group

配置 samba防火墙

如果您的Ubuntu 18.04正在运行着防火墙,则需要打开端口137138端口,允许传入的UDP连接。打开端口139445允许TCP的连接。

在本教程,我们假设您正在使用UFW管理防火墙,则可以通过启用Samba配置文件来打开端口。允许传入与传出的连接。

sudo ufw allow 'Samba'

配置 Samba服务器

在更改Samba配置文件之前,请先运行sudo cp /etc/samba/smb.conf{,.backup}命令创建备份以供将来参考。

Samba软件包随附的默认配置文件是独立Samba服务器配置。使用你喜欢的文本编辑器打开文件/etc/samba/smb.conf。

在本教程中,我们使用vim编辑文件/etc/samba/smb.conf。并将server role设置为standalone server

完成编辑后,保存文件并退出vim。然后运行testparm命令检查Samba配置文件是否存在错误。如果没有语法错误,您将看到Loaded services file OK.

确认配置没有错误后,请运行命令systemctl restart重新启动Samba服务。

sudo cp /etc/samba/smb.conf{,.backup}
sudo vim /etc/samba/smb.conf

sudo systemctl restart smbd
sudo systemctl restart nmbd
...
# Most people will want "standalone sever" or "member server".
# Running as "active directory domain controller" will require first
# running "samba-tool domain provision" to wipe databases and create a
# new domain.
   server role = standalone server
...
/etc/samba/smb.conf

默认情况下,Samba监听所有接口。如果您只是从内部网络访问,并限制外网的对Samba服务器的访问。

请取消注释行interfaces = 127.0.0.0/8 eth0并指定要绑定到的接口,还有行bind interfaces only = yes也取消注释。

...
# The specific set of interfaces / networks to bind to
# This can be either the interface name or an IP address/netmask;
# interface names are normally preferred
interfaces = 127.0.0.0/8 eth0

# Only bind to the named interfaces and/or networks; you must use the
# 'interfaces' option above to use this.
# It is recommended that you enable this feature if your Samba machine is
# not protected by a firewall or is a firewall itself.  However, this
# option cannot handle dynamic or non-broadcast interfaces correctly.
bind interfaces only = yes
...
/etc/samba/smb.conf

创建 Samba共享目录

为了更易于维护和灵活性,而不是使用标准的家目录/home/user,我们将所有Samba共享数据都存储同一个目录/samba。运行sudo mkdir /samba创建目录。

运行chgrp命令sudo chgrp sambashare /samba将/samba目录的用户组所有权设置为sambashare所有。

用户组sambashare是在安装Samba过程创建,稍后我们将所有Samba用户添加sambashare组。

sudo mkdir /samba
sudo chgrp sambashare /samba

Samba权限控制使用Linux用户和组的权限系统,但具有自己的身份验证机制,与标准Linux身份验证分开。

我们将使用useradd命令创建用户,然后使用smbpasswd设置用户密码。

正如引言中所述,我们将创建一个普通用户,该用户将拥有访问其私有文件的权限和一个具有对Samba服务器所有共享都有读写权限的管理帐户。

创建 Samba用户

首先创建用户josh,运行命令sudo useradd -M -d /samba/josh -s /usr/sbin/nologin -G sambashare josh

这里说明一下useradd命令的选项,-M不创建用户的家目录。我们将手动创建此目录。-d /samba/josh将用户的家目录设置为/samba/josh

-s /usr/sbin/nologin禁止用户的登录到系统。-G sambashare将用户添加到sambashare用户组。

接下来运行mkdir命令创建用户josh家目录,并将目录的权限设置为用户joshsambashare用户组所有,运行命令sudo chown josh:sambashare /samba/josh

sudo useradd -M -d /samba/josh -s /usr/sbin/nologin -G sambashare josh

sudo mkdir /samba/josh
sudo chown josh:sambashare /samba/josh

sudo chmod 2770 /samba/josh命令设置/samba/josh目录setgid位,在/samba/josh目录创建的文件将继承父目录的组,也就是文件所有权是sambashare用户组。

如果您未将目录的权限设置为2770,并且用户sadmin/samba/josh目录创建文件,用户sadmin将无法读取/写入文件。

最后运行命令smbpasswd设置用户密码将用户帐户添加到Samba数据库,系统将提示您输入并确认用户密码。

当使用命令smbpasswd完成设置密码后,即可启用Samba帐户,运行命令sudo smbpasswd -e josh

sudo chmod 2770 /samba/josh
sudo smbpasswd -a josh
sudo smbpasswd -e josh
New SMB password:
Retype new SMB password:
Added user josh.
Enabled user josh.

要创建另一个用户,请重复与创建用户josh时相同的过程。

接下来,让我们创建用户sadmin和用户组sadminsadmin组的所有成员将会拥有管理samba共享目录的权限。

稍后,如果您想将其他用户授予管理权限,只需将用户添加用户组sadmin

运行命令sudo useradd -M -d /samba/users -s /usr/sbin/nologin -G sambashare sadmin创建管理用户sadmin并将用户添加到用户组sambashare

同样你需要为用户sadmin设置用户密码并启用用户,运行命令sudo smbpasswd -a sadmin

sudo useradd -M -d /samba/users -s /usr/sbin/nologin -G sambashare sadmin

sudo smbpasswd -a sadmin
sudo smbpasswd -e sadmin

最后创建共享目录Users。将Users目录所有权设置为用户sadminsambashare用户组。所有通过身份验证的用户都可以访问Users目录。

运行chmod命令设置/samba/users目录的权限,为sambashare组提供读写访问权限。

sudo mkdir /samba/users
sudo chown sadmin:sambashare /samba/users
sudo chmod 2770 /samba/users

配置 Samba共享目录

继续使用vim编辑文件/etc/samba/smb.conf并添家两个共享目录的配置。运行命令sudo vim /etc/samba/smb.conf

sudo vim /etc/samba/smb.conf
[users]
    path = /samba/users
    browseable = yes
    read only = no
    force create mode = 0660
    force directory mode = 2770
    valid users = @sambashare @sadmin

[josh]
    path = /samba/josh
    browseable = no
    read only = no
    force create mode = 0660
    force directory mode = 2770
    valid users = josh @sadmin
/etc/samba/smb.conf

这些选项的配置是,[users][josh]是登录时使用的共享名称。path共享的目录,绝对路径。

browseable翻译过来就是可浏览,是否可在共享列表中列出此共享。如果设置为no,其他用户将看不到共享目录。

read only选项表示valid users列表中指定的用户是否设置仅允许读,如果值yes,则仅允许读。

force create mode此共享创建文件时设置的文件权限模式。force directory mode此共享创建目录时设置目录权限的模式。

valid users允许访问共享的用户和组的列表。群组以@符号为前缀。更多可用选项的信息,请参见Samba配置文件文档页面。

完成后,运行systemctl命令重新启动Samba服务,在以下章节中,我们将向您展示如何在Linux,macOS和Windows客户端连接到Samba共享目录。

sudo systemctl restart nmbd

安装 Samba客户端

Linux用户可以使用桌面环境的文件管理器或者命令行访问samba共享目录或挂载Samba共享目录。smbclient是允许您从命令行访问Samba共享目录。

smbclient软件包尚未预先安装在大多数Linux发行版中,因此您需要使用发行版的软件包管理器进行安装samba客户端smbclient。

如果你的计算机运行的是基于Debian的Linux发行版,例如Ubuntu,Linux mint。请运行命令sudo apt update && sudo apt install smbclient安装samba客户端smbclient。

如果你的计算机运行的是基于RedHat的Linux发行版,例如CentOS,Fedora。请运行命令sudo yum install samba-client安装samba客户端smbclient。

sudo apt install smbclient
sudo yum install samba-client

Linux 连接Samba共享目录

在命令行终端访问Samba共享的语法形式是smbclient //samba_hostname_or_server_ip/share_name -U username

例如命令smbclient //192.168.121.118/josh -U josh将以用户josh连接到Samba服务器,IP地址是192.168.121.118,访问的共享目录是josh

输入密码后,您将登录Samba命令行界面。注意密码是不可见的,输入密码完成后直接按回车键即可。

smbclient //192.168.121.118/josh -U josh
Enter WORKGROUP\josh's password: 
Try "help" to get a list of possible commands.
smb: \>

Linux 挂载Samba共享目录

要在Linux挂载 Samba共享目录,您需要安装cifs-utils软件包。

如果你的计算机运行的是基于Debian的Linux发行版,例如Ubuntu,Linux mint。请运行命令sudo apt install cifs-utils安装cifs-utils。

如果你的计算机运行的是基于RedHat的Linux发行版,例如CentOS,Fedora。请运行命令sudo yum install cifs-utils安装cifs-utils。

然后创建samba共享目录的挂载点,运行mkdir命令sudo mkdir /mnt/smbmount。最后mount命令挂载samba共享目录。系统将提示您输入用户密码。

sudo apt install cifs-utils
sudo yum install cifs-utils

sudo mkdir /mnt/smbmount

sudo mount -t cifs -o username=josh //192.168.121.118/josh /mnt/smbmount
Password for josh@//192.168.121.118/josh:  ********

Linux 桌面环境访问Samba共享目录

Gnome默认文件管理器,内置访问Samba共享目录的能力。打开文件,然后单击侧栏中的其他位置

连接到服务器中,以格式smb://samba_hostname_or_server_ip/sharename输入Samba服务地址和共享名称。

其中samba_hostname_or_server_ip是Samba服务地址,sharename共享名称。

单击连接,选择注册用户,输入Samba用户名和密码,然后单击连接。文件管理器将显示Samba服务器文件。

macOS 连接Samba共享目录

在macOS,您可以从命令行终端或者使用默认的macOS文件管理器Finder访问Samba共享。

打开Finder,选择执行,然后单击连接到。以格式smb://samba_hostname_or_server_ip/sharename输入Samba共享的地址。

其中samba_hostname_or_server_ip是Samba服务地址,sharename共享名称。

点击连接,选择注册用户,输入Samba用户名和密码,然后单击连接。文件管理器将显示Samba服务器的文件。

Windows 连接Samba共享目录

Windows用户也可以选择从命令行和GUI连接到Samba共享。以下步骤介绍如何使用Windows的文件管理器访问samba共享目录。

打开文件资源管理器,然后在左窗格中右键单击此计算机。选择选择自定义网络位置,然后单击下一步

互联网或网络地址中,以格式smb://samba_hostname_or_server_ip/sharename输入Samba共享的地址。

其中samba_hostname_or_server_ip是Samba服务地址,sharename共享名称。

单击下一步,将提示您输入登录凭证,在下一个窗口中,您可以为网络位置键入自定义名称。默认值将由Samba服务器设置。

单击下一步移至连接设置向导的最后一个屏幕。单击完成,将显示Samba服务器的文件。

结论

在本教程中,您学习如何在Ubuntu 18.04安装Samba服务器以及如何创建不同类型的共享和用户。

我们还向您展示如何Linux,macOS和Windows设备连接到Samba服务器。