Samba 服务器搭建与 Java 客户端实现

最近需要将原来使用阿里云 OSS 的程序模块改成使用公司内部搭建的文件服务器,由于目前使用的文件不多,且都是一些小文件,经过对比后,决定采用 Samba 来实现文件服务器。

Samba 是一个程序的集合,包括服务器与客户端程序,它允许在 Linux 与 Windows 实现共享文件的功能。本文先讲述如何在 CentOS 7 下安装与配置 Samba,然后讲述如何使用 Java 来实现 Samba 客户端以上传与读取文件。

Samba 安装

CentOS 平台下可以直接使用 yum 来安装 Samba 服务器以及客户端。

1
# yum install samba samba-client 

Samba 安装好后,就可以启动操作。

1
# service smb start

如果需要关闭,则使用命令:

1
# service smb stop

如果需要查看 smb 运行状态,可以使用命令:

1
# service smb status

Samba 配置

安装好 Samba 后,就可以对 Samba 进行配置了。

我们先使用以下命令添加 Linux 组 leehao 和用户 leehao。

1
2
# groupadd leehao
# useradd -g leehao leehao

接下来使用smbpasswd命令来创建 Samba 的用户:

1
# smbpasswd -a leehao

输入 Samba 用户 leehao 的密码。

Samba 的默认配置文件是/etc/samba/smb.conf。打开 smb.conf 文件,添加以下配置:

1
2
3
4
5
6
7
8
9
[portrait]
comment = leehao portrait
path = /home/leehao/upload/portrait
valid users = @leehao
public = no
admin users = leehao
writable = yes
create mask = 0640
directory mask = 0750

配置的含义是增加一个新的 Samba 共享目录,目录位置是/home/leehao/upload/portrait,且使用需要使用指定用户密码来访问。
/home/leehao/目录下创建目录upload/portrai

完成配置后,可以使用testparm命令来测试 Samba 配置是否正常。

Windows 访问 Samba

Samba 配置完成后,就可以访问了,可以在 Windows 打开文件资源窗口来访问 Samba。

Windows 窗口地址栏中输入\\10.88.x.x\portrait(改成实际 IP),按下回车,输入用户 leehao 和上面设置的密码,就可以访问 Linux 的 Samba 目录了。

image

如果弹出“不允许一个用户使用一个以上用户名与服务器…”提示,可以打开 cmd,输入net use * /del /y命令,断开所有 Windows 与 Samba 的连接,再重新连接 Samba 即可。

image

Java 实现 Samba 客户端

我们使用 jcifs 来实现 Java 读取以及下载 Samba 文件的功能。

pom.xml 文件引入 jcifs:

1
2
3
4
5
<dependency>
<groupId>jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.17</version>
</dependency>

完整的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.io.FileInputStream;
import java.io.FileOutputStream;

import jcifs.UniAddress;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbSession;

import org.apache.commons.io.IOUtils;

public class App {
private String ip = "x.x.x.x"; // 替换成真实的 ip
private int port = 139;
private String user = "leehao";
private String passwd = "xxxxxx"; // 替换成密码

public void testPut() {
try {
UniAddress ua = UniAddress.getByName(ip);
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(ip, user, passwd);
SmbSession.logon(ua, port, auth);
SmbFile sf = new SmbFile("smb://" + ip + "/portrait/upload.txt", auth);
IOUtils.copyLarge(new FileInputStream("f:/upload.txt"), sf.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}

public void testGet() {
try {
UniAddress ua = UniAddress.getByName(ip);
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(ip, user, passwd);
SmbSession.logon(ua, port, auth);
SmbFile sf = new SmbFile("smb://" + ip + "/portrait/upload.txt", auth);
IOUtils.copyLarge(sf.getInputStream(), new FileOutputStream("f:/download.txt"));
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
App app = new App();
// app.testPut();
app.testGet();
}
}

代码提供上传以下下载 Samba 文件的功能。

参考资料

  1. https://www.samba.org/
  2. https://www.samba.org/samba/docs/SambaIntro.html
  3. http://www.cnblogs.com/mchina/archive/2012/12/18/2816717.html
  4. https://www.cnblogs.com/fangfan/p/4000094.html