Samba,是种用来让 UNIX 系列的操作系统与微软 Windows 操作系统的 SMB/CIFS(Server Message Block/Common Internet File System)网络协议做链接的自由软件。1 Samba 能够为选定的 Unix 目录(包括所有子目录)创建网络共享。该功能使得 Windows 用户可以像访问普通 Windows 下的文件夹那样来通过网络访问这些 Unix 目录。

samba 有两个守护进程,smbd 和 nmbd,是 samba 的核心进程。nmbd 进程允许其他计算机浏览 Linux 服务器,smbd 进程在 SMB 服务请求到达时进行处理,并对共享的资源进行协调。

安装

sudo apt install samba

命令

smbd

启用 smb

sudo service smbd start

Samba 进程,使用 -D 参数开启守护进程。

或者

sudo /etc/init.d/samba start

smbpasswd

smbpasswd 命令属于 samba ,能够实现添加或删除 samba 用户和为用户修改密码。

语法

smbpasswd [option] [username]

smbpasswd(选项)(参数) 选项

-a:向 smbpasswd 文件中添加用户;
-c:指定 samba 的配置文件;
-x:从 smbpasswd 文件中删除用户;
-d:在 smbpasswd 文件中禁用指定的用户;
-e:在 smbpasswd 文件中激活指定的用户;
-n:将指定的用户的密码置空。

用户名:指定要修改 SMB 密码的用户。

添加用户

首先在 /etc/passwd 中添加一条,按照此格式:用户名:密码:uid:gid: 用户描述:主目录:登陆 shell

einverne:*:1000:65534:einverne:/var:/bin/false

然后添加 Samba 用户:

smbpasswd -a einverne

修改用户密码

smbpasswd einverne

配置

Samba 的配置文件地址在 /etc/samba/smb.conf

[global]
    netbios name = OpenWrt
    display charset = UTF-8
    interfaces = 127.0.0.1/8 lo 192.168.1.1/24 ipv6 address/60 br-lan
    server string = OpenWrt Samba Server        # 服务器说明,显示了 samba 版本信息,可自定义
    unix charset = UTF-8
    workgroup = WORKGROUP	# Windows 默认
    host allow =                                # 可以把 ip 写全或只写前几位,表示允许访问服务端的客户端,与 hosts deny 刚好相反
    browseable = yes
    deadtime = 30		# This is useful to stop a server's resources being exhausted by a large number of inactive connections
    domain master = yes
    encrypt passwords = true
    enable core files = no
    guest account = root
    guest ok = yes
    #invalid users = root
    local master = yes
    load printers = no
    log file = /var/log/samba/%m.log            # 日志文件位置
    max log size = 50                           # 文件大小设置,单位是 M
    map to guest = Bad User
    max protocol = SMB2
    min receivefile size = 16384
    null passwords = yes
    obey pam restrictions = yes
    os level = 65
    passdb backend = smbpasswd                  # 用户名密码存放方式
    preferred master = yes
    printable = no
    security = user                             # 设置 samba 的安全等级
    smb encrypt = disabled
    smb passwd file = /etc/samba/smbpasswd
    socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=40960 SO_SNDBUF=40960
    syslog = 2
    strict allocate=no
    use sendfile = yes
    writeable = yes
    large readwrite = yes
    aio read size = 40960
    aio write size = 40960
    read raw = yes
    write raw = yes

[Home]
    path = /home/user			# 目录
    browseable  = no
    writable = yes              # 是否可写
    valid users = %S            # 具有合法登陆身份的用户登陆时,家目录变为自己的家目录

# 创建了一个 Share 名为 OpenWrt
[OpenWrt]
    path = /mnt/sda1			# 目录
    valid users = root			# 允许 root 读写操作
    read only = no				# 允许写
    guest ok = no				# 不允许匿名
    create mask = 0777			# 新文件权限
    directory mask = 0777		# 新文件夹权限

[public]                        # 公共目录访问
    comment = Public Stuff      # 注释
    path = /home/samba
    public = yes
    writable = yes
    write list =+staff          # 该目录除了 staff 的组员拥有读写权限外,其他用户仅可读

Samba 安全等级可选值有 4 种

  • user 由提供服务的 samba 服务器负责检查账户及密码(默认)
  • share 无需共享密码,任何人都可以访问 samba 资源
  • server 该级别下,身份验证由 windows 主机或者 samba 负责
  • domain 身份验证由另一台 windows 主机负责

用户名密码存放方式设置可选值有 3,默认为 tdbsam,位置 /var/lib/samba/private/passwd.tdb

  • smbpasswd 使用 /etc/samba/smbpasswd 给系统用户设置 samba 密码,这种方式,用户必须为系统用户
  • tdbsam 使用数据库文件 passdb.tdb,可用 smbpasswd -a 创建 samba 用户,也可用 pdbedit 创建
  • ldapsam 使用 ldap 方式验证用户

其中如果选择使用 tdbsam 那么用户管理可以使用如下方法

pdbedit -a username              新建 samba 账户
pdbedit -x username              删除 samba 账户
pdbedit -L                               列出 samba 用户列表,读取 passdb.tdb
pdbedit -Lv                             列出 samba 用户列表详细信息
pdbedit -c “[D]” -u username  暂停该 samba 用户账号
pdbedit -c “[]” -u username     恢复该 samba 用户账号

配置参数只读配置

正如上面提到的,创建一个新的名为 Openwrt 的共享,需要有些配置,有些配置看名字就能够看出,但是有一些有些复杂。

如果想要创建一个只读的,任何人都可以访问的分享:

[Share]
    path = /media/movie
    comment = this is folder sync from bt
    read only = yes
    guest ok = yes
    create mask = 0777			# 新文件权限
    directory mask = 0777		# 新文件夹权限

参数:

  • create mode – 这个配置定义新创建文件的属性。Samba 在新建文件时,会把 dos 文件的权限映射成对应的 unix 权限,在映射后所得的权限,会与这个参数所定义的值进行与操作。然后再和下面的 force create mode 进行或操作,这样就得到最终 linux 下的文件权限。
  • force create mode – 见上面的描述。相当于此参数所设置的权限位一定会出现在文件属性中。
  • directory mode – 这个配置与 create mode 参数类似,只是它是应用在新创建的目录上。Samba 在新建目录时,会把 dos–>linux 映射后的文件属性,与此参数所定义的值相与,再和 force directory mode 相或,然后按这个值去设置目录属性。
  • force directory mode – 见上面的描述。相当于此参数中所设置的权限位一定会出现在目录的属性中。
  • 说明一点,上面的 create mode 和 create mask 参数是同义词,用哪个都可以;而 directory mode 和 directory mask 参数是相同的。

用户名密码共享

公共的共享可能会有安全问题,所以可以通过用户名密码来管理权限。如果要创建一个用户名密码访问的共享,配置

[PasswordShare]
    path = /home/samba
    writable = yes          # 是否可写
    public = yes            # 是否公开
    browseable = yes        # 是否允许在工作组
    create mode = 0655
    directory mode = 0755   # 设置不同的用户登陆后创建的文件和文件夹权限
    valid users = user,user1,@share    # 允许访问该共享的用户名(多个用户或者组中间用逗号隔开,组用“@组名”表示)

若希望每个人创建的内容都可以被其他人修改,则设置为 0770, 若希望每个人创建的内容只能被自己修改,分别设置 create 为 0655 和 directory 为 0755

useradd user
useradd user1
groupadd share
usermod -aG share user
usermod -aG share user1
mkdir /home/samba
chmod 777 /home/samba
chgrp share /home/samba
echo "example" >  /home/samba/file1.txt
smbpasswd -a user
smbpasswd -a user1

客户端

客户端验证 Linux 访问 samba:

smbclient -L 192.168.2.200/publicshare  -u user     # 密码是自己设置的密码,查看共享内容
smbclient //192.168.2.200/publicshare -U user       # 密码是自己设置的密码,ls 可看到共享的详细内容

客户端挂载命令为(客户端需安装 cifs-utils)

mount -t cifs -o username=einverne,password=xxxxx //192.168.2.200/publicshare /home/samba

reference