linux 上使用 samba 共享文件夹给 windows
想要在 Windows 客户端上像访问本地文件一样来访问 Linux 服务器上的文件,除了 rsync、sftp 等工具外能近似满足该需求,最经典、最方便的方式还是使用 Samba。本篇介绍如何使用 Samba 共享 Linux 文件给 Windows。
简介
Samba 是 Linux 和 Unix 系统上实现 smb 协议的一个软件,分为服务端和客户端。smb 是一种在局域网上共享文件和打印机的一种通信协议,为局域网内的不同计算机之间提供文件和打印机等资源的共享服务。
Samba 监听端口有 TCP 139、445,UDP 137、138,其中 TCP 端口对应的服务是 smbd 服务,提供对服务器中文件、打印资源的共享访问;UDP 端口对应的服务是 nmbd 服务,提供基于 NetBIOS 主机名称的解析。
Samba 的使用用户都是系统用户,在 /etc/passwd
中,密码通过如下命令设置:
1 | # username 取值 /etc/passwd,设置的密码可以与系统用户密码不同 |
Samba 安全级别有3个,分别是 user, server, domain,其中 user 用于本地验证,server 用于由另一台制定的服务器对用户身份进行认证,domain 表示由域控进行身份验证。
安装
1 | sudo apt update |
查看运行情况:
1 | sudo systemctl status smb.service |
设置开机启动:
1 | sudo systemctl enable smb.service |
使用
添加需要共享的文件夹信息到配置文件:
1 | cat >> /etc/samba/smb.conf << EOF |
这里我把服务器的根目录添加到共享中,并改名为 power,下面添加 Samba 用户并设置一个访问共享文件夹的密码:
1 | smbpasswd -a jinzhongxu |
验证配置文件是否有问题:
1 | testparm |
如果一切正常,此时,Windows 就可以访问该服务器的共享文件了。
更多参数设置如下:
参数 | 作用 |
---|---|
workgroup | 表示设置工作组名称 |
server string | 表示描述 samba 服务器 |
security | 表示设置安全级别,其值可为 share、user、server、domain |
passdb backend | 表示设置共享帐户文件的类型,其值可为 tdbsam(tdb数据库文件)、ldapsam(LDAP目录认证)、smbpasswd(兼容旧版本 samba 密码文件) |
comment | 表示设置对应共享目录的注释,说明信息,即文件共享名 |
browseable | 表示设置共享是否可见 |
writable | 表示设置目录是否可写 |
path | 表示共享目录的路径 |
guest ok | 表示设置是否所有人均可访问共享目录 |
public | 表示设置是否允许匿名用户访问 |
write list | 表示设置允许写的用户和组,组要用 @ 表示,例如 write list = root,@root |
valid users | 设置可以访问的用户和组,例如 valid users = root,@root |
hosts deny | 设置拒绝哪台主机访问,例如 hosts deny = 192.168.1.100 |
hosts allow | 设置允许哪台主机访问,例如 hosts allow = 192.168.1.200 |
printable | 表示设置是否为打印机 |
Windows 访问
在 Windows 上使用 win + r
打开运行,输入服务器 IP 地址(这里假设服务器 IP 是 192.168.1.12):
1 | # 注意 \\ |
或者在资源管理器地址栏输入上面的地址:\\192.168.1.12
。然后会弹出一个登录界面,输入设置的 samba 用户 jinzhongxu
,然后输入上面设置的密码即可。建议保存凭证和固定共享文件夹到快速访问,下次自动登录。
QA
实际使用中遇到的一些问题:
- windows 输入访问地址后,提示:“不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接”,解决方法如下,打开 CMD: 然后重新访问。
1
2
3
4# 查看建立的链接
net use
# 端口所有链接
net use * /del /y - 如果能够访问服务器图形界面,也可以在需要共享文件夹上右键进行共享。此时,可不用在 Samba 配置文件中添加配置信息。
- 对于用户家目录,如
/home/jinzhongxu
,不要改变该文件夹的权限,否则将导致通过密钥 ssh 不成功。