Go HTTP File Server 是一个简单的基于命令行的 HTTP 文件服务器,用于共享本地文件系统。
特性
- 比 Apache/Nginx 目录索引页更友好的用户界面
- 适应移动显示
- 单一可执行文件
- 如果启用,可以将当前目录的全部内容作为归档文件下载
- 如果启用,可以上传文件到当前目录
- 可以为页面渲染指定自定义主题
- 支持位置别名(将另一个目录挂载到 URL 位置)
编译
最低要求的 Go 版本是 1.18。
go build main.go
这将在当前目录中生成可执行文件 “main”。
示例
在端口 8080 上启动服务器,根目录是当前工作目录:
ghfs -l 8080
在端口 8080 上启动服务器,根目录是 /usr/share/doc:
ghfs -l 8080 -r /usr/share/doc
在默认端口上启动服务器,根目录是 /tmp,并允许上传文件到文件系统目录 /tmp/data:
ghfs -r /tmp -u /data
共享 /etc 中的文件,同时将 /usr/share/doc 挂载到 URL 路径 /doc:
ghfs -r /etc -a :/doc:/usr/share/doc
在端口 8080 上启动服务器,为 HTTPS 协议提供服务:
ghfs -k /path/to/certificate/key -c /path/to/certificate/file -l 8080
不显示以 ‘.’ 开头的隐藏 Unix 目录和文件。 提示:用引号包裹通配符以防止由 shell 展开。
ghfs -H '.*'
在控制台显示访问日志:
ghfs -L -
HTTP 基本认证:
- 需要对 /files URL 进行认证
- 用户名:user1,密码:pass1
- 用户名:user2,密码:pass2
ghfs --auth /files --user user1:pass1 --user-sha1 user2:8be52126a6fde450a7162a3651d589bb51e9579d
启动 2 个虚拟主机:
- 服务器 1
- 在端口 80 上监听 HTTP
- 在端口 443 上监听 HTTPS
- 证书文件:/cert/server1.pem
- 密钥文件:/cert/server1.key
- 主机名:server1.example.com
- 根目录:/var/www/server1
- 服务器 2
- 在端口 80 上监听 HTTP
- 在端口 443 上监听 HTTPS
- 证书文件:/cert/server2.pem
- 密钥文件:/cert/server2.key
- 主机名:server2.example.com
- 根目录:/var/www/server2
ghfs --listen-plain 80 --listen-tls 443 -c /cert/server1.pem -k /cert/server1.key --hostname server1.example.com -r /var/www/server1 ,, --listen-plain 80 --listen-tls 443 -c /cert/server2.pem -k /cert/server2.key --hostname server2.example.com -r /var/www/server2
使用方法
ghfs [options]
-l|--listen <ip|port|:port|ip:port|socket> ...
服务器监听的 IP 和端口,例如 ":80" 或 "127.0.0.1:80"。
如果指定了 --cert 和 --key,则端口会监听 TLS 连接。
如果未指定端口,则使用 "80" 作为纯 HTTP 模式,或 "443" 作为 TLS 模式。
如果值包含 "/" 则将其视为 Unix 套接字文件。
可以省略标志 "-l" 或 "--listen"。
--listen-plain <ip|port|:port|ip:port|socket> ...
类似于 --listen,但强制使用非 TLS 模式
--listen-tls <ip|port|:port|ip:port|socket> ...
类似于 --listen,但强制使用 TLS 模式,如果没有指定证书或密钥将失败。
--hostname <hostname> ...
指定与当前虚拟主机关联的主机名。
如果值以 "." 开头,将其视为后缀,以匹配所有子域级别。例如 ".example.com"
如果值以 "." 结尾,将其视为前缀,以匹配所有后缀域级别。
-r|--root <directory>
服务器的根目录。
默认为当前工作目录。
-R|--empty-root
使用虚拟空目录作为根目录。
仅共享别名目录时很有用。
-a|--alias <separator><url-path><separator><fs-path> ...
设置路径别名。
将文件系统路径挂载到 URL 路径。
例如:":/doc:/usr/share/doc"
--prefix <path> ...
在特定的子 URL 路径下提供文件。
如果服务器位于反向代理后面,并且接收到的请求没有代理路径剥离,这可能很有用。
-/|--auto-dir-slash [<status-code>=301]
如果请求的目录列表页面 URL 末尾没有 "/",则重定向到带有后缀的 URL。
如果请求的文件 URL 末尾有 "/",则重定向到不带后缀的 URL。
--default-sort <sortBy>
文件和目录的默认排序规则。
可用的排序键:
- `n` 按名称升序排序
- `N` 按名称降序排序
- `e` 按类型(后缀)升序排序
- `E` 按类型(后缀)降序排序
- `s` 按大小升序排序
- `S` 按大小降序排序
- `t` 按修改时间升序排序
- `T` 按修改时间降序排序
- `_` 不排序
目录排序:
- `/<key>` 目录在文件之前
- `<key>/` 目录在文件之后
- `<key>` 目录与文件混合
-I|--dir-index <file> ...
为目录指定默认索引文件。
--global-restrict-access [<allowed-host> ...]
通过检测请求头 `Referer` 或 `Origin`,限制第三方主机对所有 URL 路径的访问。
如果请求头为空,目录列表页面仍然允许访问。
如果没有指定允许的主机,则文件内容只能从当前主机访问。注意这不会帮助限制其他将域名指向你的主机并可能与当前虚拟主机匹配的人,除非明确指定允许的主机。
"主机" 可以是使用默认端口的主机名,或者是 "host:port" 的形式。
--restrict-access <separator><url-path>[<separator><allowed-host>...] ...
类似于 --global-restrict-access,但适用于特定的 URL 路径(和子路径)。
例如:"#/url/path#example1.com#example2.com"。
--restrict-access-dir <separator><fs-path>[<separator><allowed-host>...] ...
类似于 --global-restrict-access,但适用于文件系统路径(和子路径)。
例如:"#/fs/path#example1.com#example2.com"。
--global-header <name>:<value> ...
添加自定义 HTTP 响应头。
--header <separator><url-path><separator><name><separator><value> ...
为特定的 URL 路径(和子路径)添加自定义 HTTP 响应头。
--header-dir <separator><fs-path><separator><name><separator><value> ...
类似于 --header,但使用文件系统路径而不是 URL 路径。
--user [<username>]:[<password>] ...
为当前虚拟主机指定基本认证的用户,允许空的用户名和/或密码。
--user-base64 [<username>]:[<base64-password>] ...
--user-md5 [<username>]:<md5-password> ...
--user-sha1 [<username>]:<sha1-password> ...
--user-sha256 [<username>]:<sha256-password> ...
--user-sha512 [<username>]:<sha512-password> ...
指定基本认证的用户,使用编码密码。
--global-auth
对所有 URL 路径使用基本认证。
--auth <url-path> ...
--auth-user <separator><url-path>[<separator><allowed-username>...] ...
对特定的 URL 路径(和子路径)使用基本认证。
--auth-dir <fs-path> ...
--auth-dir-user <separator><fs-path>[<separator><allowed-username>...] ...
对特定的文件系统路径(和子路径)使用基本认证。
-U|--global-upload
允许上传所有 URL 路径的文件。
使用时要小心。
-u|--upload <url-path> ...
--upload-user <separator><url-path>[<separator><allowed-username>...] ...
设置允许上传文件的 URL 路径(和子路径)。
使用时要小心。
--upload-dir <fs-path> ...
--upload-dir-user <separator><fs-path>[<separator><allowed-username>...] ...
类似于 --upload,但使用文件系统路径代替 URL 路径。
使用时要小心。
上传选项的注意事项:
如果文件名存在且为常规文件,
将首先尝试删除它(如果启用了删除,例如通过 --delete),
否则将尝试添加或增加数字后缀。
对于目录上传模式,只有启用了 mkdir 时才会上传子目录。
--global-mkdir
允许在所有 URL 路径下创建子目录。
--mkdir <url-path> ...
--mkdir-user <separator><url-path>[<separator><allowed-username>...] ...
允许在特定的 URL 路径(和子路径)下创建子目录。
--mkdir-dir <fs-path> ...
--mkdir-dir-user <separator><fs-path>[<separator><allowed-username>...] ...
类似于 --mkdir,但使用文件系统路径代替 URL 路径。
mkdir 选项的注意事项:
为了避免歧义,不能创建被别名项遮蔽的名称。
--global-delete
允许删除所有 URL 路径下的项目。
--delete <url-path> ...
--delete-user <separator><url-path>[<separator><allowed-username>...] ...
允许删除特定 URL 路径(和子路径)下的项目。
--delete-dir <fs-path> ...
--delete-dir-user <separator><fs-path>[<separator><allowed-username>...] ...
类似于 --delete,但使用文件系统路径代替 URL 路径。
delete 选项的注意事项:
为了避免歧义,不能删除路径下的别名项。
路径内非别名的文件/目录仍然可以被删除。
为了避免歧义,不能删除被别名项遮蔽的文件/目录。
-A|--global-archive
允许用户下载所有 URL 路径的当前目录的全部内容。
页面顶部将出现一个下载链接。
确保没有循环符号链接。
--archive <url-path> ...
允许用户下载特定 URL 路径(和子路径)的当前目录的全部内容。
--archive-dir <fs-path> ...
类似于 --archive,但使用文件系统路径代替 URL 路径。
--global-cors
允许所有 URL 路径的 CORS 请求。
--cors <url-path> ...
允许特定 URL 路径(和子路径)的 CORS 请求。
--cors-dir <fs-path> ...
允许特定文件系统路径(和子路径)的 CORS 请求。
-c|--cert <file> ...
指定 TLS 证书文件。
-k|--key <file> ...
指定 TLS 证书的密钥文件。
--theme <file>
指定一个 zip 归档文件作为自定义主题,用于呈现页面和资源,而不是内置的。
主题内容在运行时缓存在内存中。
--theme-dir <directory>
指定包含主题文件的目录。
每次请求都会评估主题内容。
这对于开发主题很方便。
主题选项的注意事项:
--theme 和 --theme-dir 是互斥的。
--theme-dir 优先。
页面模板文件名始终是 "index.html"。
使用 "?asset=<asset-path>" 引用主题中的资产。
--hsts [<max-age>]
启用 HSTS(HTTP Strict Transport Security)。
只有当当前虚拟主机同时在标准端口上监听纯 HTTP 和 TLS 时才可用。
--to-https [<target-port>]
将纯 HTTP 请求重定向到 HTTPS TLS 端口。
目标端口必须在当前虚拟主机的 --listen-tls 中存在。
如果省略了目标端口,则使用 --listen-tls 中的第一项。
-S|--show <wildcard> ...
-SD|--show-dir <wildcard> ...
-SF|--show-file <wildcard> ...
如果指定,将显示匹配通配符的文件或目录(除非被隐藏选项隐藏)。
-H|--hide <wildcard> ...
-HD|--hide-dir <wildcard> ...
-HF|--hide-file <wildcard> ...
如果指定,将不显示匹配通配符的文件或目录。
-L|--access-log <file>
访问日志文件。
设置 "-" 以使用 stdout。
设置为空以禁用访问日志。
-E|--error-log <file>
错误日志文件。
设置 "-" 以使用 stderr。
设置为空以禁用错误日志。
默认为 "-"。
--config <file>
从外部文件指定选项。
其内容是任何其他选项的选项列表,
与命令行上指定的形式相同,
由空格字符分隔。
外部配置的优先级低于命令行上指定的参数。
如果在命令行上指定了一个选项,那么该选项的外部配置将被忽略。
设置 "-" 以使用 stdin。
,,
要指定具有选项的多个虚拟主机,请用此标志分隔这些主机的选项。
上面的选项可以为每个虚拟主机指定。
如果多个虚拟主机共享相同的 IP 和端口,
使用 --hostname 根据请求来识别它们。
如果请求的主机名不匹配任何虚拟主机,
服务器将尝试使用没有主机名的第一个虚拟主机,
否则使用第一个虚拟主机。
环境变量
GHFS_PID_FILE
指定 PID 文件路径。在应用程序启动时,PID 将被写入该文件。
GHFS_QUIET
为了防止在控制台上输出额外的信息,如可访问的 URL 等, 将值设置为 “1”。
GHFS_CPU_PROFILE_FILE
将 Go 的 CPU pprof 文件生成到特定的文件路径。
默认主题的快捷键
←
,→
:在路径项目之间移动焦点Ctrl
/Opt
+←
:将焦点移动到第一个路径项目Ctrl
/Opt
+→
:将焦点移动到最后一个路径项目↑
,↓
:在文件项目之间移动焦点Ctrl
/Opt
+↑
:将焦点移动到第一个文件项目Ctrl
/Opt
+↓
:将焦点移动到最后一个文件项目- 重复输入相同的字符将寻找以它为前缀的下一个文件。+
Shift
为相反方向。 - 非重复输入将在短时间内作为字符串记住,以寻找下一个文件前缀匹配。+
Shift
为相反方向。 - 当启用上传时,粘贴(
Ctrl
/Cmd
+v
)图像或文本内容将作为文件上传。