最近有一个需求,因为对应的车间调试电脑是无法使用U盘的,但是需要拷贝一些调试电脑上相关的日志数据到U盘中,而车间的linux系统服务器是可以读写对应的U盘的,遂想通过文件共享服务器的方式共享调试电脑的文件传输到服务器上的U盘中。 大概的需求如下:
- 支持指定目录下的文件上传和下载功能
- 可以通过浏览器便捷访问
- 需要有用户登录的功能,指定用户登录才可以进行上传和下载功能
- 可以指定共享指定目录下的文件
经过一些对比文件共享服务器相关软件后,发现chfs还是比较符合该需求的。
介绍
使用
下载
我们通过官网下载指定版本的链接即可,我这里采用命令行程序以及Window进行测试 解压得到可执行的exe文件,
运行
- 在对应的文件夹的地址栏输入cmd,打开控制台程序,并且直接启动程序。
发现默认的80端口被其他服务占用,查看文档更改启动的端口号为18080
usage: chfs.exe []
-file string
Configuration file.
-path string
Shared directories, separated by '|'. (default ".")
-port uint
HTTP listening port. (default 80)
-version
Print version.
- 更改端口并重新启动,成功启动后通过浏览器访问文件服务器,
经过测试,可以正常的上传和下载文件,但是我们的需求还需要有用户登录功能,chfs也已经为我们提供了该功能,可以通过配置文件实现。
配置文件
#---------------------------------------
# 请注意:
# 1,如果不存在键或对应值为空,则不影响对应的配置
# 2,配置项的值,语法如同其对应的命令行参数
#---------------------------------------
# 监听端口
port=
# 共享根目录,通过字符'|'进行分割
# 注意:
# 1,带空格的目录须用引号包住,如 path="c:\a uply name\folder"
# 2,可配置多个path,分别对应不同的目录
path=
# IP地址过滤
allow=
# 用户操作日志存放目录,默认为空
# 如果赋值为空,表示禁用日志
log=
# 网页标题
html.title=
# 网页顶部的公告板。可以是文字,也可以是HTML标签,此时,需要适用一对``(反单引号,通过键盘左上角的ESC键下面的那个键输出)来包住所有HTML标签。几个例子:
# 1,html.notice=内部资料,请勿传播
# 2,html.notice=`<img src="https://mat1.gtimg.com/pingjs/ext2020/qqindex2018/dist/img/qq_logo_2x.png" width="100%"/>`
# 3,html.notice=`<div style="background:black;color:white"><p>目录说明:</p><ul>一期工程:一期工程资料目录</ul><ul>二期工程:二期工程资料目录</ul></div>`
html.notice=
# 是否启用图片预览(网页中显示图片文件的缩略图),true表示开启,false为关闭。默认关闭
image.preview=
# 下载目录策略。disable:禁用; leaf:仅限叶子目录的下载; enable或其他值:不进行限制。
# 默认值为 enable
folder.download=
#-------------- 设置生效后启用HTTPS,注意监听端口设置为443-------------
# 指定certificate文件
ssl.cert=
# 指定private key文件
ssl.key=
# 设置会话的生命周期,单位:分钟,默认为30分钟
session.timeout=
# 文件/目录删除模式:
# 1: 安全删除:移动到系统回收站 [不是所有操作系统都支持,建议使用前进行测试。默认模式]
# 2: 安全删除:移动到chfs的专属回收站: ~/.chfs_trashbin, 程序会删除存储超过1个月的文件
# 3: 真正删除
file.remove=1
#----------------- ------------------------
# 注意: 账户配置区域放置到配置文件的后面
#------------------------------------------
#----------------- 账户及控制规则 -------------------
# [xxx] xxx即为账户名, 访客的用户名为guest
# password 账户密码
# rule.default 账户对所有的目录和文件的访问权限,但可以针对任意子目录进行重新设定访问权限,以覆盖默认的权限
# rule.none 表示对哪些子目录设置为不可访问的权限,多个目录使用字符'|'分割,也可以分为多行。注意:该子目录本身也不可访问!
# rule.r 表示对哪些子目录设置为读权限,多个目录使用字符'|'分割,也可以分为多行。注意: 该子目录本身不受影响,影响的只是它所包含的目录和文件!
# rule.w 表示对哪些子目录设置为写权限,多个目录使用字符'|'分割,也可以分为多行。注意: 该子目录本身不受影响,影响的只是它所包含的目录和文件!
# rule.d 表示对哪些子目录设置为最高访问权限,多个目录使用字符'|'分割,也可以分为多行。注意: 该子目录本身不受影响,影响的只是它所包含的目录和文件!
#
# 示例:
# [foo]
# password=bar
# rule.default=r
# rule.none=d:\公司制度|d:\财务票据
# rule.r=d:\施工项目\2021年
# rule.r=d:\施工项目\2022年
# rule.d=d:\个人目录\foo
#
# 该账户名为foo,密码为bar,默认访问权限是读权限,但账户没有“d:\公司制度”和“d:\财务票据”的访问权限,且
# 对“d:\施工项目\2021年”和“d:\施工项目\2021年”只有读权限,对“d:\个人目录\foo”有最高访问权限。
#
#账户xxx,访客的用户名为guest
[xxx]
password=
rule.default=
rule.none=
rule.r=
rule.w=
rule.d=
自定义配置
#---------------------------------------
# 请注意:
# 1,如果不存在键或对应值为空,则不影响对应的配置
# 2,配置项的值,语法如同其对应的命令行参数
#---------------------------------------
# 监听端口
# = 监听端口修改为18080 =
port=18080
# 共享根目录,通过字符'|'进行分割
# 注意:
# 1,带空格的目录须用引号包住,如 path="c:\a uply name\folder"
# 2,可配置多个path,分别对应不同的目录
# = 共享D盘目录 =
path="D:"
# IP地址过滤
allow=
# 用户操作日志存放目录,默认为空
# 如果赋值为空,表示禁用日志
log=
# 网页标题
html.title=
# 网页顶部的公告板。可以是文字,也可以是HTML标签,此时,需要适用一对``(反单引号,通过键盘左上角的ESC键下面的那个键输出)来包住所有HTML标签。几个例子:
# 1,html.notice=内部资料,请勿传播
# 2,html.notice=`<img src="https://mat1.gtimg.com/pingjs/ext2020/qqindex2018/dist/img/qq_logo_2x.png" width="100%"/>`
# 3,html.notice=`<div style="background:black;color:white"><p>目录说明:</p><ul>一期工程:一期工程资料目录</ul><ul>二期工程:二期工程资料目录</ul></div>`
html.notice=
# 是否启用图片预览(网页中显示图片文件的缩略图),true表示开启,false为关闭。默认关闭
image.preview=
# 下载目录策略。disable:禁用; leaf:仅限叶子目录的下载; enable或其他值:不进行限制。
# 默认值为 enable
folder.download=
#-------------- 设置生效后启用HTTPS,注意监听端口设置为443-------------
# 指定certificate文件
ssl.cert=
# 指定private key文件
ssl.key=
# 设置会话的生命周期,单位:分钟,默认为30分钟
# = 调整会话的生命周期为1分钟 =
session.timeout=1
# 文件/目录删除模式:
# 1: 安全删除:移动到系统回收站 [不是所有操作系统都支持,建议使用前进行测试。默认模式]
# 2: 安全删除:移动到chfs的专属回收站: ~/.chfs_trashbin, 程序会删除存储超过1个月的文件
# 3: 真正删除
file.remove=1
#----------------- ------------------------
# 注意: 账户配置区域放置到配置文件的后面
#------------------------------------------
#----------------- 账户及控制规则 -------------------
# [xxx] xxx即为账户名, 访客的用户名为guest
# password 账户密码
# rule.default 账户对所有的目录和文件的访问权限,但可以针对任意子目录进行重新设定访问权限,以覆盖默认的权限
# rule.none 表示对哪些子目录设置为不可访问的权限,多个目录使用字符'|'分割,也可以分为多行。注意:该子目录本身也不可访问!
# rule.r 表示对哪些子目录设置为读权限,多个目录使用字符'|'分割,也可以分为多行。注意: 该子目录本身不受影响,影响的只是它所包含的目录和文件!
# rule.w 表示对哪些子目录设置为写权限,多个目录使用字符'|'分割,也可以分为多行。注意: 该子目录本身不受影响,影响的只是它所包含的目录和文件!
# rule.d 表示对哪些子目录设置为最高访问权限,多个目录使用字符'|'分割,也可以分为多行。注意: 该子目录本身不受影响,影响的只是它所包含的目录和文件!
#
# 示例:
# [foo]
# password=bar
# rule.default=r
# rule.none=d:\公司制度|d:\财务票据
# rule.r=d:\施工项目\2021年
# rule.r=d:\施工项目\2022年
# rule.d=d:\个人目录\foo
#
# 该账户名为foo,密码为bar,默认访问权限是读权限,但账户没有“d:\公司制度”和“d:\财务票据”的访问权限,且
# 对“d:\施工项目\2021年”和“d:\施工项目\2021年”只有读权限,对“d:\个人目录\foo”有最高访问权限。
#
#账户xxx,访客的用户名为guest
# 访客无法访问任何的文件
[guest]
password=
rule.default=
rule.none="D:"
rule.r=
rule.w=
rule.d=
# 张三可以访问D:\,只读,同时02-share文件夹不可见
[zhangsan]
password="zhangsan"
rule.default=r
rule.none="D:\02-share"
rule.r=
rule.w=
rule.d=
# admin可以读写D:\下的任意文件
[admin]
password=admin
rule.default=rw
rule.none=
rule.r=
rule.w=
rule.d=
在 chfs.exe文件下新建config.ini文件,将上述内容填进去,并重新启动
访客用户界面
张三账户界面
可以下载文件,无法查看02-share文件夹内容,无法上传和新建文件
admin账户界面
可以正常下载文件,也可以上传和编辑文件和文件夹
会话超时自动退出
账户登录一分钟后刷新界面 账户登录一分钟后下载
总结
单文件支持多平台,即开即用,通过简单的配置即可完成文件共享的功能,在没有外部网络以及外部存储介质的情况下,做文件服务器确实是一个不错的选择。