在Linux上配置SMB文件共享

本文档详细介绍了如何在Linux环境中配置SMB文件共享服务,包括创建用户组、设置共享目录权限、创建用户、修改Samba配置文件,以及客户端的挂载和权限检验。通过设置,使得属于developer组的用户具有读写权限,而其他用户只有读权限。最后,验证了配置的正确性和有效性。

一 需求

共享目录是/data
辅助组developer内的成员具有读写权限;
辅助组developer外的成员只有读权限;
用户dick属于辅助组的成员,密码是123456
用户james不属于辅助组的成员,密码是123456

二 系统环境准备

服务端IP:10.0.0.11
客户端IP:10.0.0.12

[root@client ~]# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 7.6 (Maipo)
[root@client ~]# uname -r
3.10.0-957.el7.x86_64

更新好yum源,便于安装需要的软件包。

[root@client ~]# cat /etc/yum.repos.d/CentOS-Base.repo 
[base]
name=CentOS-7 - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/os/$basearch/
        http://mirrors.aliyuncs.com/centos/7/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/7/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
-------------------------------------------
中间省略大量内容
-------------------------------------------

[contrib]
name=CentOS-7 - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/contrib/$basearch/
        http://mirrors.aliyuncs.com/centos/7/contrib/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/7/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

关闭防火墙与SELinux

systemctl stop firewalld
systemctl disable firewalld
[root@server ~]# grep ^SELINUX /etc/selinux/config 
SELINUX=disabled
SELINUXTYPE=targeted 
setenforce 0

三 服务端配置流程

1 安装软件

[root@server ~]# yum install -y samba   samba-client

2 创建用户组

[root@server ~]# groupadd -r developer

3 创建共享目录并设置权限

[root@server ~]# mkdir /data
[root@server ~]# chown  :developer /data
[root@server ~]# ll /data/ -d
drwxr-xr-x 2 root developer 6 Nov 25 04:10 /data/

给共享目录设置SGID权限,且阻止其他用户进行写入

[root@server ~]# chmod 2775 /data
[root@server ~]# ll /data/ -d
drwxrwsr-x 2 root developer 6 Nov 25 04:10 /data/

4 创建用户并映射到samba和本地

创建属于developer用户组的用户dick

[root@server ~]# useradd -s /sbin/nologin -G developer dick
[root@server ~]# smbpasswd -a dick
New SMB password:
Retype new SMB password:
Added user dick.

创建不属于developer用户组的用户james

[root@server ~]# useradd -s /sbin/nologin james
[root@server ~]# smbpasswd -a james
New SMB password:
Retype new SMB password:
Added user james.

5 修改配置文件

[root@server ~]# vim /etc/samba/smb.conf

[global]
        # workgroup参数后面随便填什么都行
        workgroup = canway
        security = user
        passdb backend = tdbsam

=============
中间的内容省略
=============

[my_share_data]
        path = /data
        write list = @developer

修改完配置文件,记得检查一下语法是否正确。

[root@server data]# testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

看到提示OK,就没有问题。然后回车键,会输出你刚才做的修改配置信息。

6 重启服务,并设置为开机自启

[root@server ~]# systemctl restart smb nmb
[root@server ~]# systemctl enable smb nmb

四 客户端配置流程

1 安装软件

[root@client ~]# yum install -y cifs-utils

2 创建挂载点(挂载目录)

[root@client ~]# mkdir -p /mnt/dick
[root@client /]# mkdir -p /mnt/james

3 挂载文件系统

此处挂载设备处写的格式是://挂载主机的IP/挂载主机配置文件的项目名称

[root@client /]# mount -o username=dick //10.0.0.11/my_share_data /mnt/dick
Password for dick@//10.0.0.11/data:  ******
[root@client /]# mount -o username=james //10.0.0.11/my_share_data /mnt/james/
Password for james@//10.0.0.11/data:  ******

然后在/etc/fstab进行永久挂载

[root@client /]# tail -2 /etc/fstab 
//10.0.0.11/my_share_data   /mnt/dick    cifs    credentials=/root/dick.smb     0 0
//10.0.0.11/my_share_data   /mnt/james   cifs    credentials=/root/james.smb    0 0

然后创建对应的用户名和密码文件

[root@client dick]# cat /root/dick.smb 
username=dick
password=123456
[root@client dick]# cat /root/james.smb 
username=james
password=123456

/etc/fstab前两列分别是挂载设备和挂载目录。
第三列是文件系统类型,此处是cifs文件系统类型。
第四列的credentials是cifs系统挂载时需要输入用户密码,由于是自动挂载,所以需要提供一个密码文件,在挂载时让系统自动读取该文件就可以获得密码,无需交互式输入密码。

4 检查挂载情况

首先将所有挂载的目录重新挂载一次,检查是否有报错。
然后检查挂载的具体信息。

[root@client /]# mount -a
[root@client dick]# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root       19G  4.1G   15G  23% /
devtmpfs                   470M     0  470M   0% /dev
tmpfs                      487M     0  487M   0% /dev/shm
tmpfs                      487M  8.1M  479M   2% /run
tmpfs                      487M     0  487M   0% /sys/fs/cgroup
/dev/sda1                  197M  143M   55M  73% /boot
//10.0.0.11/my_share_data   19G  4.1G   15G  23% /mnt/dick
//10.0.0.11/my_share_data   19G  4.1G   15G  23% /mnt/james
tmpfs                       98M     0   98M   0% /run/user/0

五 对配置好的SMB文件系统进行检验

1 检查用户组内的用户

首先在/mnt/dick中进行创建文件并写入内容,在客户端一切顺利,且该文件属主是root用户

[root@client /]# echo 123456 > /mnt/dick/a.txt
[root@client /]# cd /mnt/dick/
[root@client dick]# ll
total 1024
-rwxr-xr-x 1 root root 7 Nov 25  2022 a.txt
[root@client dick]# cat a.txt 
123456

在服务端,我们看到操作成功,且属主和属组信息发生变化。

[root@server ~]# cd /data/
[root@server data]# ll
total 4
-rwxr--r-- 1 dick developer 7 Nov 25 18:26 a.txt
[root@server data]# cat a.txt 
123456

2 检查非用户组内的用户

/mnt/james中无法创建文件

[root@client ~]# echo 123456 > /mnt/james/a.txt
-bash: /mnt/James/a.txt: Permission denied

但可以进入到共享目录中,查看已经创建的文件内容

[root@client ~]# cd /mnt/james/
[root@client james]# ll
total 1024
-rwxr-xr-x 1 root root 7 Nov 25  2022 a.txt
[root@client james]# cat a.txt 
123456

到此为止,SMB文件共享配置成功。

<think>嗯,用户想了解如何在Linux上使用Qt和C++实现SMB文件读取。首先,我需要回忆一下Qt中处理文件系统相关的类。记得Qt的QFile和QDir可以处理本地文件,但SMB是网络共享协议,可能需要特定的路径格式。 用户之前提到过在Windows下使用IP地址访问共享文件夹,但在不同网段有问题,后来改用计算机名解决了。不过在Linux下,可能需要不同的方法。我记得Linux通常通过mount命令挂载SMB共享,然后在Qt中访问挂载点。或者,Qt有没有内置的SMB支持呢? 查阅一下资料,发现Qt的QFile其实支持直接访问SMB路径,但需要正确的URL格式。比如使用smb://开头的路径,但不确定是否在所有平台上都适用。或者在Linux下,可能需要先将共享目录挂载到本地,再通过普通文件操作访问。这样的话,用户需要在代码中调用系统命令来挂载和卸载共享,这可能涉及到权限问题,比如需要sudo密码,这不太方便。 另外,用户引用的内容中提到使用计算机名而不是IP地址可以跨网段访问,这在Linux下是否也适用呢?可能需要配置正确的NetBIOS名称解析或者使用Avahi之类的服务。 再考虑Qt中的网络模块,是否有相关的类可以处理SMB协议?好像Qt主要支持HTTP、FTP等协议,SMB可能不在其中。所以可能需要依赖系统级的挂载,然后在Qt中访问本地路径。 另外,用户提到C++实现下载文件时用了WinINet库,但在Linux下不可用。所以可能需要寻找跨平台的解决方案,或者使用Linux特定的库,比如libsmbclient。不过Qt的跨平台特性可能需要封装这些库。 总结下来,可能的步骤是:在Linux系统中挂载SMB共享到本地目录,然后在Qt中使用QFile和QDir操作该目录。或者使用第三方库如libsmbclient在代码中直接访问SMB共享,而不需要挂载。 需要验证这两种方法的可行性。第一种方法比较直接,但需要处理挂载命令和权限。第二种方法更程序化,但可能需要额外的依赖。 另外,用户可能希望代码示例,所以需要提供如何在Qt中实现这两种方式的示例。比如,使用QProcess调用mount命令挂载共享,然后用Qt访问;或者使用libsmbclient的C++代码集成到Qt项目中。 还需要注意跨平台的问题,如果用户希望代码在Linux和Windows都能用,可能需要条件编译,但用户现在只关心Linux。 最后,确保回答结构清晰,步骤明确,并包含代码示例和注意事项,比如权限、依赖库等。</think>在Linux系统下使用QT和C++实现SMB文件读取,可通过以下两种主流方案实现: ### 方案一:挂载SMB共享为本地目录 1. **系统级挂载(推荐)** ```bash sudo mount -t cifs //server_ip/share_name /mnt/smb_mount -o username=user,password=pass,vers=3.0 ``` 在QT中使用标准文件接口访问: ```cpp QDir dir("/mnt/smb_mount"); QFileInfoList files = dir.entryInfoList(QDir::Files); ``` 2. **运行时动态挂载** ```cpp QProcess mountProcess; mountProcess.start("sudo", {"mount", "-t", "cifs", "//192.168.1.100/shared", "/mnt/tmp", "-o", "username=user,password=pass"}); mountProcess.waitForFinished(); ``` ### 方案二:使用libsmbclient库 1. **安装依赖库** ```bash sudo apt-get install libsmbclient-dev ``` 2. **QT工程配置(.pro文件)** ```qmake LIBS += -lsmbclient ``` 3. **实现SMB文件读取** ```cpp #include <libsmbclient.h> void readSmbFile(const char* url) { SMBCCTX* ctx = smbc_new_context(); smbc_setOptionUserData(ctx, "username=user;password=pass"); int fd = smbc_open(ctx, "smb://192.168.1.100/shared/file.txt", O_RDONLY, 0); char buffer[1024]; ssize_t bytes_read = smbc_read(ctx, fd, buffer, sizeof(buffer)); smbc_close(ctx, fd); } ``` ### 关键参数说明 | 参数 | 说明 | 示例值 | |---------------|-----------------------------|-------------------------| | vers | SMB协议版本 | 3.0/2.0/1.0 | | sec | 安全认证模式 | ntlmv2/ntlm | | uid/gid | 挂载目录所有者 | uid=1000,gid=1000 | ### 注意事项 1. 挂载方案需要处理sudo密码交互问题,建议配置/etc/fstab实现免密挂载[^2] 2. libsmbclient方案需处理异步IO操作,建议配合QThread使用 3. 路径格式需注意:`smb://`协议头为libsmbclient专用格式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值