Smb的使用

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;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值