Smb的使用
说明:仅主要介绍在windows下的使用,linux与windows一样
文章目录
一、文件共享
一、windows下的文件共享
二、linux下的文件共享
一、什么是samba
samba 是基于SMB协议(ServerMessage Block,信息服务块)的开源软件,samba也可以是SMB协议的商标。SMB是一种Linux、UNIX系统上可用于共享文件和打印机等资源的协议,这种协议是基于Client\Server型的协议,Client端可以通过SMB访问到Server(服务器)上的共享资源。当Windows是 Client,CentOS是服务器时,通过Samba就可以实现window访问Linux的资源,实现两个系统间的数据交互。samba服务程序已经成为在Linux系统和Windows系统之间共享文件的最佳选择,当然在Linux系统与Linux系统之间的文件共享也选择samba。
二、安装samba
我使用的是centos7,直接用yum安装就可以
yum install samba
三、配置smb.conf
smb.conf是服务端的配置文件,刚安装的就自带smb.conf文件,里面有很多注释的行,但实际工作是用不了,所以我们把自带的文件备份一个,复制一个简洁的主配置文件
mv /etc/samba/smb.conf /etc/samba/smb_bak.conf
cat /etc/samba/smb_bak.conf | grep -v "#" | grep -v ";" > /etc/samba/smb.conf
[global]
workgroup = SAMBA #设定 Samba Server 所要加入的工作组或者域。
security = user #设置用户访问Samba Server的验证方式,一共有四种验证方式
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
[database]
comment = share database #这个是共享文件的描述
path = /data/share #设置共享文件夹的路径
public = no #设置是否允许匿名访问
writable = yes
配置完成保存,输入testparm
命令校验配置文件
四、创建samba登录用户
这个用户可以直接用Linux用户,但密码也需要设置,所以我在这里新建一个samba专用用户
useradd smb_root
smbpasswd -a smb_root #然后输入两次密码就可
五、创建共享路径
mkdir -p /data/sharecd /data
chmod -R 775 share
chown -R smb_root:smb_root share
六、windows访问共享目录
和windows一致,不在介绍
七、Linux下共享文件
首先在客户端安装支持文件共享服务的软件包cifs-utils
yum install cifs-utils
在Linux客户端,按照samba服务端的用户名和密码、共享域的顺序将相关的信息写入到一个认证文件中
vim auth.smb
写入如下内容:
username = smb_root
password = smb_root
domain = ZIJIN
在客户端创建共享目录,把挂载信息写入/etc/fstab文件中
mkdir -p /data/share
vim /etc/fstab
在最后追加一下信息:
//192.168.1.14/data/share /data/share cifs credentials=/root/auth.smb 0 0
挂载文件系统
mount -a
测试,在服务端的/data/share目录下新建一个文件,然后再客户端查看,是否能看到,如果能就可以了
八、拓展
yum install -y samba
systemctl start smb #启动samba
systemctl restart smb #在修该过相应的配置文件之后需要重启该服务
systemctl stop smb #关闭samba
systemctl enable smb #设置 开机自动运行
cat /etc/resolv.conf #查看DNS
vi /etc/resolv.conf #配置DNS
nameserver 225.5.5.5 #DNS
---------------------------------------------------------------------
path 设定共享文件的路径
writable = ok 是否可写
security = share 验证与登陆方式(user是用户登陆,share默认公开)
browsable =yes 是否可浏览
read only = No 是否有写权限 no 代表有写权限
public = yes 是否公开
-----------------------------------------------------------------------
如果 samba 服务器所在的机器上开启了防火墙服务,则需要开放 139 和 445 端口,然后重启防火墙服务
firewall-cmd --zone=public --add-port=139/tcp --permanent
firewall-cmd --zone=public --add-port=445/tcp --permanent
systemctl restart firewalld
-----------------------------------------------------------------------
启动smba,命令:systemctl start smb,使用命令chkconfig smb on设置开机自启
--------------------------------------------------------------------------
[root]
comment = all
path = /
browseable = Yes
writable = Yes
valid users = @root
write list = @root
read only = No
public = yes
create mask = 0777
directory mask = 0777
--------------------------------------------------------------------------------
SAMBA配置后可能ROOT没有写权限,可能是SELINUX在作怪,把它禁用即可,先实时停止它
setenforce 0
vi /etc/sysconfig/selinux
将配置SELINUX的值改成disabled
二、使用
1、引入依赖
<!-- SMB -->
<dependency>
<groupId>jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.17</version>
</dependency>
2、配置
## 项目自定义配置
hxlinks:
## 文件共享配置
smb:
userName: administrator
password: 891314154
host: 172.10.10.236
## 另一个系统共享出的文件目录名
shardPath: /waternet
3、使用
package com.access.util;
import com.access.config.DataInitLoad;
import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.*;
import java.net.MalformedURLException;
/**
* Smb 工具类
*
* @author 微笑
* @version 1.0
* @since 2023/3/10 11:33
*/
@Slf4j
@Component
public class SmbUtils {
@Value("${hxlinks.smb.userName}")
private String userName;
private static String user;
@Value("${hxlinks.smb.password}")
private String password;
private static String pwd;
@Value("${hxlinks.smb.host}")
private String hostUrl;
private static String host;
@Value("${hxlinks.smb.shardPath}")
private String shardPath;
private static String shareFolderPath;
@PostConstruct
private void set() {
user = userName;
pwd = password;
host = hostUrl;
shareFolderPath = shardPath;
}
/**
* 获取smb链接地址
*/
// private static String getSmbUrlOfFile(String filePath) {
// String path = shareFolderPath + filePath.replace("\\", "/").replace(DataInitLoad.WATCH_FILE.substring(0, DataInitLoad.WATCH_FILE.lastIndexOf("/")), "");
// if (path.endsWith(".xls") || path.endsWith(".doc")) {
// path = path + "x";
// }
// return "smb://" + user + ":" + pwd + "@" + host + path;
// }
// private static String getSmbUrl(String filePath) {
// String path = shareFolderPath + filePath;
// if (path.endsWith(".xls") || path.endsWith(".doc")) {
// path = path + "x";
// }
// return "smb://" + user + ":" + pwd + "@" + host + path;
// }
private static SmbFile getSmbFile(String filePath) {
String path = shareFolderPath + filePath;
if (path.endsWith(".xls") || path.endsWith(".doc")) {
path = path + "x";
}
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(host, user, pwd);
String smburl = String.format("smb://%s/%s", host, path);
SmbFile smbFile = null;
try {
smbFile = new SmbFile(smburl, auth);
} catch (MalformedURLException e) {
e.printStackTrace();
}
return smbFile;
}
/**
* 上传文件
* localFilePath 本地文件路径
*/
public static void uploadFileToSharedFolder(String localFilePath) {
log.info("---文件开始同步上传---" + localFilePath);
InputStream inputStream = null;
OutputStream outputStream = null;
try {
// 若为高低版本文件,则转换为高版本的输入流
inputStream = getInputStream(localFilePath);
String endFilePath = localFilePath
.replace("\\", "/")
.replace(DataInitLoad.WATCH_FILE.substring(0, DataInitLoad.WATCH_FILE.lastIndexOf("/")), "");
smbMkDirs(endFilePath.substring(0, endFilePath.lastIndexOf("/")));
SmbFile smbFile = getSmbFile(endFilePath);
outputStream = new SmbFileOutputStream(smbFile);
byte[] buffer = new byte[4096];
int len = 0; // 读取长度
while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) {
outputStream.write(buffer, 0, len);
}
// 刷新缓冲的输出流
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 创建文件夹
*/
public static void smbMkDirs(String folderPath) {
SmbFile smbFile;
try {
smbFile = getSmbFile(folderPath);
if (!smbFile.exists()) {
smbFile.mkdirs();
log.info("共享文件目录不存在,已创建");
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除文件
*/
public static void deleteFile(String localFilePath) {
log.info("---文件开始同步删除---" + localFilePath);
SmbFile SmbFile;
try {
String endFilePath = localFilePath
.replace("\\", "/")
.replace(DataInitLoad.WATCH_FILE.substring(0, DataInitLoad.WATCH_FILE.lastIndexOf("/")), "");
SmbFile = getSmbFile(endFilePath);
if (SmbFile.exists()) {
SmbFile.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据全路径获取输入流
*
* @param localFilePath 文件全路径
* @return 输入流
*/
public static InputStream getInputStream(String localFilePath) {
InputStream inputStream = null;
try {
File localFile = new File(localFilePath);
if (localFilePath.endsWith(".doc")) {
inputStream = AsposeUtils.convertDoc2Docx(new FileInputStream(localFile));
} else if (localFilePath.endsWith(".xls")) {
inputStream = AsposeUtils.convertXls2Xlsx(new FileInputStream(localFile));
} else {
inputStream = new FileInputStream(localFile);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return inputStream;
}
}