#server

smb

developer

配置smb访问服务器资源

Finder也能当FileZilla用

smb概述

smb是一个文件共享协议,常常用在NAS上,不过也可以用在服务器上。smb最大的好处就是Finder支持,亲测Finder不能挂ssh连接的文件系统。FileZilla是基于ssh的,但是界面太丑了。

配置好smb后,用Finder连接服务器,甚至可以用VSCode打开目录,直接编辑原始文件。对于GUI用户来说这比git确实好用多了。

直接用公网ip作为smb地址的话似乎不太安全,所以我的服务器管理都在tailscale内网里。不过网络配置这块对smb配置是基本透明的,不用太操心这个。

服务器端配置

初始化

sudo apt update
sudo apt install samba

smb的用户系统

smb有一个自己的用户系统,和系统的用户不一样。然而,smb的用户系统是依赖于系统的用户的。smb的用户是系统的用户的子集。我就不追求结构化的语言了,直接给实际例子。

假设服务器现在只有一个用户me,他具有root权限(这是绝大多数服务器的常见情景)。如果想部署smb,必须添加一个新用户,因为smb用户不能是拥有root权限的用户。这一点有待考证,但我实测如此。

  1. 添加系统用户。添加用户smbu作为smb专用的用户。
sudo useradd -M -s /sbin/nologin smbu

adduser也是可以的,不过这会导致多出来一个/home/smbu,参数少的代价就是混乱。

sudo adduser smbu

现在我们有系统用户:

  • me,有root权限
  • smbu,无root权限,不需要设置shell和home目录
  1. 添加smb用户
sudo smbpasswd -a smbu
sudo smbpasswd -e smbu
sudo pdbedit -L

过程中需要输入密码,这个密码是smb管理的,独立于系统中这个用户的密码。

  1. 验证
getent passwd smbu

如果有输出,则添加成功了。

创建smb目录

smb分享的目录的权限是一个复杂的问题,所以在简单的情境下,我们先创建一个smb专用的目录。一会还会讨论共享已有目录的方法。

sudo mkdir -p /srv/samba
sudo chown smbu:smbu /srv/samba
sudo chmod -R 777 /srv/samba

配置smb.conf

sudo nano /etc/smaba/smb.conf

smb的几乎所有行为都在这里配置。它主要分为两个模块:

  • [global],全局行为,基本不用管,用默认配置就可以
  • [share],配置每个分享

默认配置中会有几个share,不用管,直接在最下面添加自己的就可以。

[samba]
path = /srv/samba
valid users = smbu
guest ok = no
read only = no
browsable = yes

每次修改后都重启一遍服务

sudo systemctl restart smbd nmbd
sudo systemctl status smbd

这就完事了!

客户端配置

linux客户端

使用linux客户端测试是最方便的,命令简单直观。

sudo apt install smbclient
smbclient -L 100.64.x.x -U smbu

这会列出服务器提供的share,此时应该出现samba的条目。

smbclient 100.64.x.x -U smbu

这将进入smb交互界面。

mac客户端

当然,我们的终极目标是在mac上访问。打开访达,在菜单栏中找到“前往-连接服务器”(cmd+K),在弹出的窗口的地址栏输入

smb://100.64.x.x/samba

弹出认证界面,输入smbu和密码就可以了。此时就可以在访达中看到共享的目录,可以往里拖入文件,就像这个目录在本机上一样。

然而,访达时常出问题。也可以用命令行测试smb的连通性。

sudo mkdir /Volumes/test
mount_smbfs //[email protected]/samba /Volumes/test

smbutil似乎也是能用的,可以试试。

共享其他目录

如果只能共享一个中转站,那smb就太鸡肋了。所幸它可以共享已经存在的、属于其他用户的目录,而且也能随意操作,同时不破坏原有的权限。为什么能这样?因为smb是拥有sudo权限的(大概)。

在下面这个例子里,我们要共享/home/me/site,从而实现在mac上操作网站相关的文件。在smb.conf的末尾添加:

[site]
path = /home/me/site
valid users = smbu
force user = me
guest ok = no
read only = no
browsable = yes
writable = yes
create mask = 0644
directory mask = 0755

关键就在与force user字段,这会告诉smb,在操作时“假装”用的是用户me。也就是说,smbu用户smb认证,me用户用来操作文件。后面的两个mask则确保了创建文件时不会出现权限问题。

在用访达连接时,大概率不用再输入用户密码,因为它默认一个服务器上只用一个用户来连接smb。这也就又说明了一开始创建新用户的必要性。

Debug

搞砸了,没连上,怎么办?我真是折腾了一番,十分崩溃。所以记录一些Debug的方法。

看日志

systemd的日志:

journalctl -u smbd.service -e

smb自己的日志:

cd /var/log/samba

这是smb存放日志的地方,都可以看一看。log.smbd是smb服务的日志。log.100.64.x.x是某个ip访问smb的日志,里面记录了认证过程等关键信息。

防火墙?

有可能ufw禁用了端口,不过概率不大

sudo ufw allow from 100.0.0.0/8 to any port 445
sudo ufw allow from 100.0.0.0/8 to any port 139

最小化配置

smb.conf可能变得十分混乱。gpt给出了一个最小化配置,但是我并没使用,仅供参考。

[global]
workgroup = WORKGROUP
server string = Samba Server
security = user
map to guest = never
server min protocol = SMB2
server max protocol = SMB3
[public]
path = /srv/samba
valid users = samba
read only = no
browsable = yes
guest ok = no

用户问题

可以删掉smbu重新添加试试。

sudo smbpasswd -x smbu

注意workgroup没有任何作用,不用花时间研究它。

目录的权限也是个问题,一定要chown到smbu。

重新安装smb

这是真正works的方法!

sudo systemctl stop smbd nmbd
sudo apt purge samba samba-common samba-common-bin smbclient

sudo rm -rf /etc/samba/
sudo rm -rf /var/lib/samba/
sudo rm -rf /var/cache/samba/
sudo rm -rf /var/log/samba/

然后再重新来一遍就可以了!