Linux搭建Samba服務(wù)器實(shí)現(xiàn)跨平臺(tái)文件共享
引言
在當(dāng)今多設(shè)備、多操作系統(tǒng)并存的辦公與開(kāi)發(fā)環(huán)境中,跨平臺(tái)文件共享已成為剛需。無(wú)論是 Windows 用戶需要訪問(wèn) Linux 服務(wù)器上的項(xiàng)目源碼,還是 macOS 用戶希望同步設(shè)計(jì)素材,亦或是 Android/iOS 移動(dòng)端臨時(shí)獲取配置文件——Samba 都能提供穩(wěn)定、高效、安全的解決方案。
本文將從零開(kāi)始,手把手教你如何在 Linux 系統(tǒng)上搭建 Samba 服務(wù)器,并通過(guò) Java 編寫(xiě)客戶端程序?qū)崿F(xiàn)自動(dòng)化文件上傳下載,最后輔以網(wǎng)絡(luò)拓?fù)鋱D和權(quán)限流程圖幫助理解整體架構(gòu)。
什么是 Samba?
Samba 是一套開(kāi)源軟件套件,它實(shí)現(xiàn)了 SMB/CIFS 協(xié)議(Server Message Block / Common Internet File System),允許 Linux/Unix 系統(tǒng)與 Windows 系統(tǒng)之間無(wú)縫共享文件和打印機(jī)資源。
SMB 最初由 IBM 開(kāi)發(fā),后被微軟廣泛用于 Windows 文件共享系統(tǒng)。Samba 項(xiàng)目始于 1992 年,目標(biāo)是讓非 Windows 系統(tǒng)也能“說(shuō) SMB 的語(yǔ)言”。
Samba 的核心優(yōu)勢(shì):
- ? 跨平臺(tái)兼容性極強(qiáng):Windows、macOS、Linux、Android、iOS 均原生支持掛載
- ? 支持用戶認(rèn)證、權(quán)限控制、加密傳輸
- ? 可集成 Active Directory(企業(yè)級(jí)部署)
- ? 支持軟鏈接、硬鏈接、ACL、配額等高級(jí)功能
- ? 社區(qū)活躍,文檔豐富,長(zhǎng)期維護(hù)
環(huán)境準(zhǔn)備
我們以 Ubuntu 22.04 LTS 為例進(jìn)行演示,其他發(fā)行版(如 CentOS、Debian、Fedora)操作類似,僅包管理器命令略有不同。
系統(tǒng)要求
- Linux 服務(wù)器一臺(tái)(物理機(jī)或虛擬機(jī)均可)
- root 權(quán)限或 sudo 權(quán)限
- 至少一個(gè)可訪問(wèn)的公網(wǎng) IP 或局域網(wǎng) IP
- 防火墻開(kāi)放 TCP 139 和 445 端口
- Java 8+(用于后續(xù)客戶端示例)
第一步:安裝 Samba
打開(kāi)終端,執(zhí)行以下命令安裝 Samba 服務(wù):
sudo apt update sudo apt install samba -y
安裝完成后,驗(yàn)證版本:
smbd --version
輸出類似:
Version 4.15.13-Ubuntu
第二步:創(chuàng)建共享目錄
我們將在 /srv/samba/shared 創(chuàng)建一個(gè)共享目錄:
sudo mkdir -p /srv/samba/shared sudo chown nobody:nogroup /srv/samba/shared sudo chmod 755 /srv/samba/shared
注意:nobody:nogroup 是默認(rèn)匿名訪問(wèn)賬戶,生產(chǎn)環(huán)境建議使用特定用戶組。
你也可以創(chuàng)建帶用戶權(quán)限的私有目錄:
sudo mkdir -p /srv/samba/private sudo groupadd smbgroup sudo useradd -g smbgroup -s /sbin/nologin smbuser sudo chown smbuser:smbgroup /srv/samba/private sudo chmod 770 /srv/samba/private
第三步:配置 Samba
Samba 主配置文件位于 /etc/samba/smb.conf。備份原始配置:
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
編輯配置文件:
sudo nano /etc/samba/smb.conf
在文件末尾追加如下內(nèi)容:
[global] workgroup = WORKGROUP server string = Samba Server %v netbios name = ubuntu-samba security = user map to guest = bad user dns proxy = no [shared] path = /srv/samba/shared browsable = yes writable = yes guest ok = yes read only = no create mask = 0755 directory mask = 0755 [private] path = /srv/samba/private valid users = smbuser browsable = yes writable = yes guest ok = no read only = no create mask = 0644 directory mask = 0755
參數(shù)說(shuō)明:
| 參數(shù)名 | 作用說(shuō)明 |
|---|---|
workgroup | 工作組名稱,默認(rèn)為 WORKGROUP |
security=user | 啟用用戶認(rèn)證 |
map to guest | 無(wú)效用戶映射為訪客 |
browsable | 是否在“網(wǎng)絡(luò)鄰居”中顯示 |
writable | 是否允許寫(xiě)入 |
guest ok | 是否允許匿名訪問(wèn) |
valid users | 指定允許訪問(wèn)該共享的用戶 |
第四步:添加 Samba 用戶
即使系統(tǒng)已有用戶,也需要為其設(shè)置 Samba 密碼:
sudo smbpasswd -a smbuser
輸入兩次密碼即可。
Samba 密碼獨(dú)立于系統(tǒng)密碼,即使系統(tǒng)用戶無(wú)登錄 shell,也可正常使用 Samba。
啟用用戶:
sudo smbpasswd -e smbuser
第五步:重啟服務(wù) & 開(kāi)機(jī)自啟
sudo systemctl restart smbd nmbd sudo systemctl enable smbd nmbd
檢查狀態(tài):
sudo systemctl status smbd
應(yīng)看到 active (running) 狀態(tài)。
第六步:防火墻配置
Ubuntu 默認(rèn)使用 ufw,開(kāi)放 Samba 端口:
sudo ufw allow 139/tcp sudo ufw allow 445/tcp sudo ufw reload
驗(yàn)證端口監(jiān)聽(tīng):
sudo ss -tulnp | grep smbd
應(yīng)看到類似:
tcp LISTEN 0 50 *:139 *:* users:(("smbd",pid=1234,fd=32))
tcp LISTEN 0 50 *:445 *:* users:(("smbd",pid=1234,fd=33))
第七步:客戶端連接測(cè)試
Windows 客戶端
打開(kāi)“文件資源管理器”,地址欄輸入:
\\<服務(wù)器IP>\
例如:
\\192.168.1.100\
應(yīng)能看到 shared 和 private 兩個(gè)共享目錄。
雙擊 private,會(huì)提示輸入用戶名密碼 → 輸入 smbuser 及其密碼即可訪問(wèn)。
macOS 客戶端
Finder → “前往” → “連接服務(wù)器” → 輸入:
smb://192.168.1.100
點(diǎn)擊“連接”,選擇“注冊(cè)用戶”,輸入憑據(jù)。
Linux 客戶端掛載
安裝 cifs-utils:
sudo apt install cifs-utils -y
創(chuàng)建掛載點(diǎn):
sudo mkdir /mnt/samba-private
掛載:
sudo mount -t cifs //192.168.1.100/private /mnt/samba-private -o username=smbuser,password=yourpassword,uid=$(id -u),gid=$(id -g)
網(wǎng)絡(luò)架構(gòu)圖(mermaid)
下面這張圖展示了典型的 Samba 服務(wù)器在網(wǎng)絡(luò)中的位置及其與各類客戶端的關(guān)系:

第八步:編寫(xiě) Java 客戶端程序(JCIFS)
雖然現(xiàn)代 Java 推薦使用 SMBJ(支持 SMB2/3),但為了兼容性和教學(xué)目的,我們先使用 JCIFS(僅支持 SMB1,適合內(nèi)網(wǎng)測(cè)試)。
注意:SMB1 存在安全風(fēng)險(xiǎn),不建議在公網(wǎng)使用。生產(chǎn)環(huán)境請(qǐng)升級(jí)至 SMBJ。
Maven 依賴
在 pom.xml 中添加:
<dependency>
<groupId>jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.17</version>
</dependency>JCIFS 官方主頁(yè):http://jcifs.samba.org/
示例代碼:上傳文件到 Samba
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class SambaUploader {
private static final String SMB_URL = "smb://smbuser:yourpassword@192.168.1.100/private/";
private static final String LOCAL_FILE_PATH = "/home/user/test.txt";
public static void main(String[] args) {
try {
uploadFile();
System.out.println("? 文件上傳成功!");
} catch (IOException e) {
System.err.println("? 上傳失敗:" + e.getMessage());
e.printStackTrace();
}
}
public static void uploadFile() throws IOException {
SmbFile remoteDir = new SmbFile(SMB_URL);
if (!remoteDir.exists()) {
remoteDir.mkdirs();
}
SmbFile remoteFile = new SmbFile(SMB_URL + "uploaded_test.txt");
try (FileInputStream fis = new FileInputStream(LOCAL_FILE_PATH);
SmbFileOutputStream sfos = new SmbFileOutputStream(remoteFile)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
sfos.write(buffer, 0, bytesRead);
}
}
}
}示例代碼:從 Samba 下載文件
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class SambaDownloader {
private static final String SMB_URL = "smb://smbuser:yourpassword@192.168.1.100/private/uploaded_test.txt";
private static final String LOCAL_SAVE_PATH = "/home/user/downloaded_test.txt";
public static void main(String[] args) {
try {
downloadFile();
System.out.println("? 文件下載成功!");
} catch (IOException e) {
System.err.println("? 下載失?。? + e.getMessage());
e.printStackTrace();
}
}
public static void downloadFile() throws IOException {
SmbFile remoteFile = new SmbFile(SMB_URL);
if (!remoteFile.exists()) {
throw new IOException("遠(yuǎn)程文件不存在:" + SMB_URL);
}
try (SmbFileInputStream sfis = new SmbFileInputStream(remoteFile);
FileOutputStream fos = new FileOutputStream(LOCAL_SAVE_PATH)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = sfis.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
}
}
}示例代碼:列出目錄內(nèi)容
import jcifs.smb.SmbFile;
import java.io.IOException;
public class SambaLister {
private static final String SMB_DIR_URL = "smb://smbuser:yourpassword@192.168.1.100/private/";
public static void main(String[] args) {
try {
listDirectory();
} catch (IOException e) {
System.err.println("? 列出目錄失敗:" + e.getMessage());
e.printStackTrace();
}
}
public static void listDirectory() throws IOException {
SmbFile dir = new SmbFile(SMB_DIR_URL);
if (!dir.exists() || !dir.isDirectory()) {
System.out.println("?? 目錄不存在或不是目錄:" + SMB_DIR_URL);
return;
}
SmbFile[] files = dir.listFiles();
if (files == null || files.length == 0) {
System.out.println("?? 目錄為空");
return;
}
System.out.println("?? 目錄內(nèi)容:");
for (SmbFile file : files) {
String type = file.isDirectory() ? "[DIR]" : "[FILE]";
System.out.printf("%s %s (大小: %d 字節(jié))%n", type, file.getName(), file.length());
}
}
}權(quán)限控制流程圖(mermaid)
Samba 的權(quán)限控制涉及多個(gè)層級(jí),下圖展示用戶訪問(wèn)文件時(shí)的權(quán)限校驗(yàn)流程:

高級(jí)配置技巧
1. 啟用回收站功能(防止誤刪)
在共享段落中添加:
vfs objects = recycle recycle:repository = .recycle/%U recycle:keeptree = yes recycle:versions = yes recycle:touch = yes recycle:maxsize = 0
這樣刪除的文件會(huì)被移到 .recycle/用戶名/ 目錄下。
2. 限制訪問(wèn) IP(增強(qiáng)安全)
在 [global] 或具體共享段中添加:
hosts allow = 192.168.1.0/24 10.0.0.5 hosts deny = ALL
只允許指定網(wǎng)段或 IP 訪問(wèn)。
3. 日志級(jí)別調(diào)整
調(diào)試階段可開(kāi)啟詳細(xì)日志:
log level = 2 log file = /var/log/samba/%m.log max log size = 50
日志按客戶端主機(jī)名 %m 分割,便于排查問(wèn)題。
4. 使用符號(hào)鏈接
若需支持軟鏈接,添加:
follow symlinks = yes wide links = yes unix extensions = no
wide links 允許跨文件系統(tǒng)鏈接,存在安全風(fēng)險(xiǎn),請(qǐng)謹(jǐn)慎啟用。
安全加固建議
禁用 SMB1(除非必要)
在 [global] 中添加:
server min protocol = SMB2
強(qiáng)制加密傳輸(適用于公網(wǎng))
server smb encrypt = required
定期輪換密碼
sudo smbpasswd -a smbuser # 重新設(shè)置密碼
最小權(quán)限原則
不要給共享目錄 777 權(quán)限,按需分配。
監(jiān)控異常登錄
sudo tail -f /var/log/samba/log.*
性能優(yōu)化
1. 調(diào)整 socket 緩沖區(qū)
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536
2. 啟用緩存
read raw = yes write raw = yes oplocks = yes max xmit = 65535
3. 限制并發(fā)連接數(shù)(防 DoS)
max connections = 50
監(jiān)控與日志分析
Samba 日志默認(rèn)位于 /var/log/samba/,可通過(guò)腳本定時(shí)分析:
#!/bin/bash LOG_DIR="/var/log/samba" grep "ACCESS DENIED" $LOG_DIR/*.log | wc -l grep "NT_STATUS_WRONG_PASSWORD" $LOG_DIR/*.log | wc -l
你也可以集成到 Prometheus + Grafana 進(jìn)行可視化監(jiān)控。
?? Grafana 官網(wǎng):https://grafana.com/
?? Prometheus 官網(wǎng):https://prometheus.io/
自動(dòng)化腳本示例(Bash + Java)
你可以編寫(xiě)一個(gè) Bash 腳本,在每天凌晨自動(dòng)上傳備份文件:
#!/bin/bash # backup_to_samba.sh DATE=$(date +%Y%m%d) BACKUP_FILE="/backup/app_backup_$DATE.tar.gz" # 生成備份 tar -czf $BACKUP_FILE /var/www/html /etc/nginx # 調(diào)用 Java 上傳程序 java -cp ".:lib/*" SambaUploader $BACKUP_FILE # 清理本地 7 天前備份 find /backup -name "*.tar.gz" -mtime +7 -delete echo "? $BACKUP_FILE 已上傳至 Samba 服務(wù)器"
配合 crontab:
0 2 * * * /home/scripts/backup_to_samba.sh >> /var/log/backup.log 2>&1
常見(jiàn)問(wèn)題解答(FAQ)
Q1:連接時(shí)報(bào)錯(cuò) “NT_STATUS_ACCESS_DENIED”
- 檢查用戶名密碼是否正確
- 檢查
valid users是否包含該用戶 - 檢查 Linux 文件系統(tǒng)權(quán)限:
ls -l /srv/samba/private
Q2:Windows 提示 “找不到網(wǎng)絡(luò)路徑”
- 檢查防火墻是否放行 445 端口
- 檢查 Samba 服務(wù)是否運(yùn)行:
systemctl status smbd - 嘗試關(guān)閉 Windows 防火墻臨時(shí)測(cè)試
Q3:Java JCIFS 報(bào)錯(cuò) “Failed to connect: 0.0.0.0<00>/192.168.1.100”
- 確保 URL 格式正確:
smb://user:pass@ip/share/ - 確保網(wǎng)絡(luò)可達(dá),嘗試 ping 或 telnet 445
- 若使用域名,確保 DNS 解析正常
Q4:能否實(shí)現(xiàn)匿名上傳?
可以,但極度不安全!僅限內(nèi)網(wǎng)測(cè)試:
[anon_upload] path = /srv/samba/anon writable = yes guest ok = yes read only = no create mask = 0666 directory mask = 0777
并確保目錄權(quán)限:
chmod 777 /srv/samba/anon
測(cè)試你的 Samba 服務(wù)
你可以使用 smbclient 命令行工具測(cè)試:
smbclient //192.168.1.100/private -U smbuser
輸入密碼后,進(jìn)入交互式界面:
smb: \> ls smb: \> put localfile.txt remotefile.txt smb: \> get remotefile.txt downloaded.txt smb: \> exit
Java SMBJ 替代方案(推薦生產(chǎn)使用)
由于 JCIFS 僅支持 SMB1,強(qiáng)烈建議新項(xiàng)目使用 SMBJ,支持 SMB2/3,更安全高效。
Maven 依賴:
<dependency>
<groupId>com.hierynomus</groupId>
<artifactId>smbj</artifactId>
<version>0.11.5</version>
</dependency>簡(jiǎn)單上傳示例:
import com.hierynomus.mssmb2.SMB2Packet;
import com.hierynomus.smbj.SMBClient;
import com.hierynomus.smbj.auth.AuthenticationContext;
import com.hierynomus.smbj.connection.Connection;
import com.hierynomus.smbj.session.Session;
import com.hierynomus.smbj.share.DiskShare;
import java.io.File;
import java.nio.file.Files;
public class SmbjUploader {
public static void main(String[] args) throws Exception {
SMBClient client = new SMBClient();
try (Connection connection = client.connect("192.168.1.100")) {
AuthenticationContext ac = new AuthenticationContext("smbuser", "password".toCharArray(), "");
Session session = connection.authenticate(ac);
try (DiskShare share = (DiskShare) session.connectShare("private")) {
File localFile = new File("/path/to/local/file.txt");
share.upload(localFile, "remote_file.txt", Files.readAllBytes(localFile.toPath()));
System.out.println("? 上傳成功(SMBJ)");
}
}
}
}SMBJ GitHub 頁(yè)面(僅參考結(jié)構(gòu),不提供地址)→ 搜索 “hierynomus smbj”
企業(yè)級(jí)應(yīng)用場(chǎng)景
場(chǎng)景一:CI/CD 自動(dòng)部署
- Jenkins 構(gòu)建產(chǎn)物 → 通過(guò) Java 程序上傳至 Samba → 運(yùn)維掛載后部署
場(chǎng)景二:多部門(mén)文件協(xié)作
- 財(cái)務(wù)部上傳報(bào)表 → 市場(chǎng)部直接訪問(wèn) → 無(wú)需 FTP/U盤(pán)傳遞
場(chǎng)景三:移動(dòng)端素材同步
- 設(shè)計(jì)師用 iPad 保存 PSD → 自動(dòng)同步至 Samba → 開(kāi)發(fā)取用切圖
場(chǎng)景四:日志集中收集
- 多臺(tái)服務(wù)器每日壓縮日志 → Java 定時(shí)上傳 → 統(tǒng)一歸檔分析
總結(jié)
通過(guò)本文,你已掌握:
? Linux 上完整搭建 Samba 服務(wù)器
? 配置匿名/認(rèn)證共享目錄
? Windows/macOS/Linux 客戶端連接方法
? Java JCIFS/SMBJ 客戶端編程實(shí)現(xiàn)自動(dòng)化
? 安全加固與性能調(diào)優(yōu)技巧
? 企業(yè)級(jí)應(yīng)用場(chǎng)景設(shè)計(jì)
Samba 作為老牌且穩(wěn)定的跨平臺(tái)文件共享方案,依然在現(xiàn)代 IT 架構(gòu)中扮演重要角色。無(wú)論是小型工作室還是大型企業(yè),都能從中受益。
附加:一鍵安裝腳本(供參考)
#!/bin/bash
# install_samba.sh
echo "?? 正在安裝 Samba..."
sudo apt update && sudo apt install samba -y
echo "?? 創(chuàng)建共享目錄..."
sudo mkdir -p /srv/samba/{shared,private}
sudo chmod 755 /srv/samba/shared
sudo chmod 770 /srv/samba/private
echo "?? 寫(xiě)入配置文件..."
cat << EOF | sudo tee /etc/samba/smb.conf > /dev/null
[global]
workgroup = WORKGROUP
server string = Samba Server %v
security = user
map to guest = bad user
dns proxy = no
[shared]
path = /srv/samba/shared
browsable = yes
writable = yes
guest ok = yes
read only = no
[private]
path = /srv/samba/private
valid users = smbuser
browsable = yes
writable = yes
guest ok = no
read only = no
EOF
echo "?? 添加 Samba 用戶 smbuser(密碼設(shè)為 123456)..."
sudo useradd -M -s /sbin/nologin smbuser
echo -e "123456\n123456" | sudo smbpasswd -a -s smbuser
sudo smbpasswd -e smbuser
echo "?? 重啟服務(wù)..."
sudo systemctl restart smbd nmbd
sudo systemctl enable smbd nmbd
echo "?? 開(kāi)放防火墻..."
sudo ufw allow 139,445/tcp
echo "?? 安裝完成!服務(wù)器 IP:$(hostname -I | awk '{print $1}')"
echo "?? Windows 訪問(wèn):\\\\$(hostname -I | awk '{print $1}')"
保存為 install_samba.sh,賦予執(zhí)行權(quán)限:
chmod +x install_samba.sh ./install_samba.sh
結(jié)語(yǔ)
文件共享不應(yīng)成為跨平臺(tái)協(xié)作的障礙。Samba 以其成熟穩(wěn)定、配置靈活、生態(tài)完善的特點(diǎn),依然是解決這一問(wèn)題的最佳選擇之一。結(jié)合 Java 自動(dòng)化能力,更能釋放其在 DevOps、數(shù)據(jù)同步、備份歸檔等場(chǎng)景下的巨大潛力。
以上就是Linux搭建Samba服務(wù)器實(shí)現(xiàn)跨平臺(tái)文件共享的詳細(xì)內(nèi)容,更多關(guān)于Linux搭建Samba跨平臺(tái)文件共享的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
apache 二級(jí)域名解析 (window與linux)
apache 二級(jí)域名解析 window與linux下使用的方法。2009-11-11
你必須知道Linux系統(tǒng)的七種優(yōu)勢(shì)
你必須知道Linux系統(tǒng)的七種優(yōu)勢(shì),越來(lái)越多的電腦用戶開(kāi)始使用 Linux進(jìn)行辦公、學(xué)習(xí),這篇文章主要介紹了Linux系統(tǒng)的多種優(yōu)勢(shì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
centos下安裝redis服務(wù)詳細(xì)節(jié)介紹
這篇文章主要介紹了 centos安裝redis 服務(wù)的資料,這里對(duì)安裝步驟進(jìn)行了詳細(xì)的介紹,具有參考價(jià)值,有需要的小伙伴可以參考下2016-11-11
VSCode遠(yuǎn)程連接Linux部署的Docker實(shí)踐
文章介紹了如何在遠(yuǎn)程Linux上使用VSCode進(jìn)行Docker開(kāi)發(fā),包括確保Docker運(yùn)行、安裝VSCode插件(如Docker、DockerDX、ContainerTools)以及這些插件的功能和使用場(chǎng)景2026-02-02

