#serve-file #serve #http #static-file #index-file #server

app miniserve

当你真的只想立即通过 HTTP 提供一些文件时使用!

46 个版本 (26 个破坏性更新)

0.27.1 2024 年 3 月 16 日
0.26.0 2024 年 1 月 13 日
0.24.0 2023 年 7 月 6 日
0.23.0 2023 年 3 月 1 日
0.1.5 2018 年 5 月 17 日

#27HTTP 服务器

Download history 116/week @ 2024-04-12 107/week @ 2024-04-19 253/week @ 2024-04-26 259/week @ 2024-05-03 159/week @ 2024-05-10 266/week @ 2024-05-17 199/week @ 2024-05-24 143/week @ 2024-05-31 723/week @ 2024-06-07 455/week @ 2024-06-14 213/week @ 2024-06-21 104/week @ 2024-06-28 156/week @ 2024-07-05 150/week @ 2024-07-12 143/week @ 2024-07-19 240/week @ 2024-07-26

每月 702 次下载

MIT 许可证

160KB
3K SLoC

miniserve - a CLI tool to serve files and dirs over HTTP

miniserve - 一个用于通过 HTTP 提供文件和目录的 CLI 工具

CI Docker Hub Crates.io license Stars Downloads Lines of Code

当你真的只想立即通过 HTTP 提供一些文件时使用!

miniserve 是一个小巧、自包含的多平台 CLI 工具,允许您直接获取二进制文件并通过 HTTP 提供一些文件。有时这比正确做事更实用、更快。

截图

Screenshot

如何使用

提供目录

miniserve linux-distro-collection/

提供单个文件

miniserve linux-distro.iso

设置自定义索引文件以替代文件列表提供

miniserve --index test.html

提供单页应用程序 (SPA),使不存在的路径转发到 SPA 的路由器

miniserve --spa --index index.html

需要用户名/密码

miniserve --auth joe:123 unreleased-linux-distros/

需要以哈希形式提供用户名/密码

pw=$(echo -n "123" | sha256sum | cut -f 1 -d ' ')
miniserve --auth joe:sha256:$pw unreleased-linux-distros/

从文件中需要用户名/密码(使用新行分隔不同的登录)

miniserve --auth-file auth.txt unreleased-linux-distros/

生成随机的 6 位十六进制数字 URL

miniserve -i 192.168.0.1 --random-route /tmp
# Serving path /private/tmp at http://192.168.0.1/c789b6

绑定到多个接口

miniserve -i 192.168.0.1 -i 10.13.37.10 -i ::1 /tmp/myshare

以 TLS 启动

miniserve --tls-cert my.cert --tls-key my.key /tmp/myshare

使用 curl 上传文件

# in one terminal
miniserve -u -- .
# in another terminal
curl -F "path=@$FILE" http://localhost:8080/upload\?path\=/

(其中 $FILE 是文件的路径。这使用 miniserve 的默认端口 8080)

注意,对于上传,我们必须使用 -- 来区分 -u 的参数。这是因为 -u 也可以接受路径(或多个)。如果为 -u 提供了路径参数,则上传将只能到提供的路径,而不是每个路径。

这种做法的另一个影响是,当使用 -u 时,不能简单地组合标志,如 -uv。在这个例子中,您需要使用 -u -v

使用 curl 创建目录

# in one terminal
miniserve --upload-files --mkdir .
# in another terminal
curl -F "mkdir=$DIR_NAME" http://localhost:8080/upload\?path=\/

(其中 $DIR_NAME 是目录的名称。这使用 miniserve 的默认端口 8080。)

从智能手机拍照并上传

miniserve -u -m image -q

这使用 --media-type 选项,向浏览器发送预期媒体类型的提示。一些移动浏览器,如 Android 上的 Firefox,在看到这个提示时会提供打开相机应用程序的选项。

功能

  • 易于使用
  • 即插即用:默认正确处理 MIME 类型
  • 单二进制文件,无需额外依赖
  • 支持用户名和密码(以及哈希密码)的认证
  • 极快且高度并行(归功于 RustActix
  • 文件夹下载(实时压缩为 .tar.gz.zip
  • 文件上传
  • 创建目录
  • 漂亮的主题(支持浅色和深色主题)
  • 扫描二维码快速访问
  • Shell 完成功能
  • 合理的默认设置且安全
  • TLS(对于支持的架构)
  • 支持 README.md 渲染,如 GitHub 上的那样
  • 范围请求

用法

For when you really just want to serve some files over HTTP right now!

Usage: miniserve [OPTIONS] [PATH]

Arguments:
  [PATH]
          Which path to serve

          [env: MINISERVE_PATH=]

Options:
  -v, --verbose
          Be verbose, includes emitting access logs

          [env: MINISERVE_VERBOSE=]

      --index <INDEX>
          The name of a directory index file to serve, like "index.html"

          Normally, when miniserve serves a directory, it creates a listing for that directory. However, if a directory
          contains this file, miniserve will serve that file instead.

          [env: MINISERVE_INDEX=]

      --spa
          Activate SPA (Single Page Application) mode

          This will cause the file given by --index to be served for all non-existing file paths. In effect, this will serve
          the index file whenever a 404 would otherwise occur in order to allow the SPA router to handle the request instead.

          [env: MINISERVE_SPA=]

      --pretty-urls
          Activate Pretty URLs mode

          This will cause the server to serve the equivalent `.html` file indicated by the path.

          `/about` will try to find `about.html` and serve it.

          [env: MINISERVE_PRETTY_URLS=]

  -p, --port <PORT>
          Port to use

          [env: MINISERVE_PORT=]
          [default: 8080]

  -i, --interfaces <INTERFACES>
          Interface to listen on

          [env: MINISERVE_INTERFACE=]

  -a, --auth <AUTH>
          Set authentication

          Currently supported formats:
          username:password, username:sha256:hash, username:sha512:hash
          (e.g. joe:123, joe:sha256:a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3)

          [env: MINISERVE_AUTH=]

      --auth-file <AUTH_FILE>
          Read authentication values from a file

          Example file content:

          joe:123
          bob:sha256:a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
          bill:

          [env: MINISERVE_AUTH_FILE=]

      --route-prefix <ROUTE_PREFIX>
          Use a specific route prefix

          [env: MINISERVE_ROUTE_PREFIX=]

      --random-route
          Generate a random 6-hexdigit route

          [env: MINISERVE_RANDOM_ROUTE=]

  -P, --no-symlinks
          Hide symlinks in listing and prevent them from being followed

          [env: MINISERVE_NO_SYMLINKS=]

  -H, --hidden
          Show hidden files

          [env: MINISERVE_HIDDEN=]

  -S, --default-sorting-method <DEFAULT_SORTING_METHOD>
          Default sorting method for file list

          [env: MINISERVE_DEFAULT_SORTING_METHOD=]
          [default: name]

          Possible values:
          - name: Sort by name
          - size: Sort by size
          - date: Sort by last modification date (natural sort: follows alphanumerical order)

  -O, --default-sorting-order <DEFAULT_SORTING_ORDER>
          Default sorting order for file list

          [env: MINISERVE_DEFAULT_SORTING_ORDER=]
          [default: desc]

          Possible values:
          - asc:  Ascending order
          - desc: Descending order

  -c, --color-scheme <COLOR_SCHEME>
          Default color scheme

          [env: MINISERVE_COLOR_SCHEME=]
          [default: squirrel]
          [possible values: squirrel, archlinux, zenburn, monokai]

  -d, --color-scheme-dark <COLOR_SCHEME_DARK>
          Default color scheme

          [env: MINISERVE_COLOR_SCHEME_DARK=]
          [default: archlinux]
          [possible values: squirrel, archlinux, zenburn, monokai]

  -q, --qrcode
          Enable QR code display

          [env: MINISERVE_QRCODE=]

  -u, --upload-files [<ALLOWED_UPLOAD_DIR>]
          Enable file uploading (and optionally specify for which directory)

          [env: MINISERVE_ALLOWED_UPLOAD_DIR=]

  -U, --mkdir
          Enable creating directories

          [env: MINISERVE_MKDIR_ENABLED=]

  -m, --media-type <MEDIA_TYPE>
          Specify uploadable media types

          [env: MINISERVE_MEDIA_TYPE=]
          [possible values: image, audio, video]

  -M, --raw-media-type <MEDIA_TYPE_RAW>
          Directly specify the uploadable media type expression

          [env: MINISERVE_RAW_MEDIA_TYPE=]

  -o, --overwrite-files
          Enable overriding existing files during file upload

          [env: OVERWRITE_FILES=]

  -r, --enable-tar
          Enable uncompressed tar archive generation

          [env: MINISERVE_ENABLE_TAR=]

  -g, --enable-tar-gz
          Enable gz-compressed tar archive generation

          [env: MINISERVE_ENABLE_TAR_GZ=]

  -z, --enable-zip
          Enable zip archive generation

          WARNING: Zipping large directories can result in out-of-memory exception because zip generation is done in memory
          and cannot be sent on the fly

          [env: MINISERVE_ENABLE_ZIP=]

  -C, --compress-response
          Compress response

          WARNING: Enabling this option may slow down transfers due to CPU overhead, so it is disabled by default.

          Only enable this option if you know that your users have slow connections or if you want to minimize your server's bandwidth usage.

          [env: MINISERVE_COMPRESS_RESPONSE=]

  -D, --dirs-first
          List directories first

          [env: MINISERVE_DIRS_FIRST=]

  -t, --title <TITLE>
          Shown instead of host in page title and heading

          [env: MINISERVE_TITLE=]

      --header <HEADER>
          Set custom header for responses

          [env: MINISERVE_HEADER=]

  -l, --show-symlink-info
          Visualize symlinks in directory listing

          [env: MINISERVE_SHOW_SYMLINK_INFO=]

  -F, --hide-version-footer
          Hide version footer

          [env: MINISERVE_HIDE_VERSION_FOOTER=]

      --hide-theme-selector
          Hide theme selector

          [env: MINISERVE_HIDE_THEME_SELECTOR=]

  -W, --show-wget-footer
          If enabled, display a wget command to recursively download the current directory

          [env: MINISERVE_SHOW_WGET_FOOTER=]

      --print-completions <shell>
          Generate completion file for a shell

          [possible values: bash, elvish, fish, powershell, zsh]

      --print-manpage
          Generate man page

      --tls-cert <TLS_CERT>
          TLS certificate to use

          [env: MINISERVE_TLS_CERT=]

      --tls-key <TLS_KEY>
          TLS private key to use

          [env: MINISERVE_TLS_KEY=]

      --readme
          Enable README.md rendering in directories

          [env: MINISERVE_README=]

  -I, --disable-indexing
          Disable indexing

          This will prevent directory listings from being generated and return an error instead.

          [env: MINISERVE_DISABLE_INDEXING=]

  -h, --help
          Print help (see a summary with '-h')

  -V, --version
          Print version

如何安装

Packaging status

在 Linux 上:从 发布页面 下载 miniserve-linux 并运行

chmod +x miniserve-linux
./miniserve-linux

或者,如果您使用的是 Arch Linux,您可以这样做

pacman -S miniserve

Termux

pkg install miniserve

在 OSX 上:从 发布页面 下载 miniserve-osx 并运行

chmod +x miniserve-osx
./miniserve-osx

或者使用 Homebrew 安装

brew install miniserve
miniserve

在 Windows 上:从 发布页面 下载 miniserve-win.exe 并运行

miniserve-win.exe

或者使用 Scoop 安装

scoop install miniserve

使用 Cargo:请确保您有最新版本的 Rust。然后您可以运行

cargo install --locked miniserve
miniserve

使用 Docker:请确保 Docker daemon 正在运行,然后运行

docker run -v /tmp:/tmp -p 8080:8080 --rm -it docker.io/svenstaro/miniserve /tmp

使用 Podman:只需运行

podman run -v /tmp:/tmp -p 8080:8080 --rm -it docker.io/svenstaro/miniserve /tmp

使用 Helm:请参阅 @wrenix 提供的 此第三方 Helm 图表

Shell 完成功能

如果您想使用内置的 shell 完成功能,您需要运行 miniserve --print-completions <your-shell> 并将完成功能放在您 shell 的正确位置。以下提供了一些常见路径的示例

# For bash
miniserve --print-completions bash > ~/.local/share/bash-completion/completions/miniserve
# For zsh
miniserve --print-completions zsh > /usr/local/share/zsh/site-functions/_miniserve
# For fish
miniserve --print-completions fish > ~/.config/fish/completions/miniserve.fish

systemd

packaging/miniserve@.service 中可以找到一个加固的与 systemd 兼容的单位文件。您可以将此安装到 /etc/systemd/system/[email protected] 并以守护进程的方式在特定的服务路径 /my/serve/path 上启动和启用 miniserve,如下所示

systemctl enable --now miniserve@-my-serve-path

请注意,您将需要使用 systemd-escape 来正确转义路径。

如果您想自定义 miniserve 启动时使用的特定标志,您可以使用

systemctl edit miniserve@-my-serve-path

并将生成的 [Service] 部分设置为 override.conf 文件。例如

[Service]
ExecStart=/usr/bin/miniserve --enable-tar --enable-zip --no-symlinks --verbose -i ::1 -p 1234 --title hello --color-scheme monokai --color-scheme-dark monokai -- %I

请确保在最后留下%I,否则可能会服务错误的路径。如果您打算在公共接口上直接提供miniserve,可能还需要覆盖IPAddressAllowIPAddressDeny

绑定行为

为了方便,miniserve默认会尝试绑定到所有接口(如果没有提供-i)。如果明确提供了- 0.0.0.0- ::,它也会这样做。在上述所有情况下,它将绑定到IPv4和IPv6。如果您提供了明确的非默认接口,它将只绑定到该接口。您可以通过多次提供-来同时绑定到多个接口。

为什么选择这个而不是其他替代方案?

  • darkhttpd:在Windows上不容易获得,而且不像下载和运行那样简单。
  • Python内置的web服务器:需要安装Python,性能较低,而且在某些情况下也没有正确处理MIME类型。
  • netcat:使用起来不那么方便,发送目录在某些方面有些复杂

发布

这主要是我关于如何发布这个项目的笔记

  • 确保CHANGELOG.md是最新的。
  • cargorelease<version>
  • cargorelease --execute <version>
  • GitHub Actions将自动部署版本。
  • 更新Arch软件包。

依赖项

~38–57MB
~1M SLoC