概览
aktar 是同一台电脑上 Aktar 应用的遥控器。你把文件交给它,它通过 127.0.0.1 转交给 Aktar,再由 Aktar 按你已经设置好的上传目标、密钥、路径模板和链接设置完成上传。链接随后返回到你的终端。
它是什么
- 一个小巧的 Node.js 命令,适用于脚本、在你自己的 Mac 或 Windows 机器上运行的 CI 任务,以及 Typora 这类编辑器
- 可以上传文件和剪贴板内容、显示二维码,并查看你的上传目标和上传记录
- 与应用一样免费且开源(MIT)
它不是什么
- 不能独立使用:Aktar 没有运行时,它什么也上传不了。它从不保存你的存储密钥
- 不适用于 Linux 服务器或远程机器:它只和同一台电脑上的 Aktar 通信。在那些环境中,请使用存储服务商自己的 CLI
系统要求
- Aktar for Mac 0.4.0 或更高版本,或 Aktar for Windows,且至少设置了一个上传目标
- Node.js 18 或更高版本(使用 Homebrew 安装时会自动安装)
-
--name、--qr和aktar qr需要 aktar 0.2.0 或更高版本 - 复用已上传文件的链接需要 aktar 0.2.0,以及 Aktar for Mac 0.10.0 或 Aktar for Windows 0.3.0
安装
用 npm 或 Homebrew 安装一次即可。两种方式都会把 aktar 命令加入你的 PATH。
使用 npm(macOS 和 Windows)
npm install -g @getaktar/cli使用 Homebrew(macOS)
brew install getaktar/tap/aktar-cli也可以不安装,直接运行一次:
npx @getaktar/cli upload file.png查看当前版本:
aktar --version
0.2.0连接 Aktar
- 在 Mac 或 Windows 版 Aktar 中打开设置 → 集成,开启允许本地连接。之后 Aktar 只在
127.0.0.1上监听,默认端口为 47913,也可以在那里修改。 - 复制下方显示的令牌。
- 运行
aktar login,在Token:提示处粘贴令牌。输入内容不会显示,而且保存前会先向 Aktar 验证,输错的令牌不会被保存。
aktar login
Copy the token from Aktar: Settings > Integrations (turn on Allow local connections first).
Token:
Connected to Aktar 0.10.0. Saved to /Users/you/.config/aktar/cli.json令牌保存在哪里
aktar login 会把令牌和端口保存在 Mac 上的 ~/.config/aktar/cli.json(如果设置了 $XDG_CONFIG_HOME,则为 $XDG_CONFIG_HOME/aktar/cli.json),或 Windows 上的 %APPDATA%\aktar\cli.json。只有你的用户可以读取。
{
"token": "…",
"port": 47913
}aktar logout 会删除这个文件。如果想一次性断开所有客户端,在 Aktar 中点击令牌旁的重新生成,然后用新令牌重新运行 aktar login。
脚本和 CI
在构建机上可以跳过 aktar login,改为设置 AKTAR_TOKEN(如果改过端口,再设置 AKTAR_PORT)。它们优先于已保存的文件。Aktar 必须在那台机器上运行,并登录在同一个用户会话中。
AKTAR_TOKEN="$AKTAR_SECRET" aktar upload dist/app.zip -d Builds| 变量 | 作用 |
|---|---|
AKTAR_TOKEN | Aktar 设置 → 集成中的令牌。会代替已保存的令牌使用。 |
AKTAR_PORT | Aktar 本地 API 的端口(如果你改过)。--port 优先于它。 |
NO_COLOR | 用普通字符而不是终端颜色绘制二维码。 |
XDG_CONFIG_HOME | macOS 上配置文件夹的位置(默认为 ~/.config)。Windows 上使用 %APPDATA%。 |
命令
除了用纯文本或链接运行的 aktar qr,所有命令都要与 Aktar 通信。不加 -d 时,文件会上传到 Aktar 菜单栏中选中的上传目标,并像其他上传一样出现在 Aktar 的上传记录中。aktar --help 会输出同样的列表。
aktar uploadaktar upload --clipboardaktar qraktar loginaktar logoutaktar statusaktar destinationsaktar history
aktar upload
上传一个或多个文件,按顺序在每个文件完成时输出它的链接,每个文件一个。
用法
aktar upload <file>... [options]选项
| 参数 | 值 | 说明 |
|---|---|---|
-d, --destination | <name|id> | 要上传到的上传目标,按名称或 ID 指定。默认为 Aktar 中选中的那个。 |
-f, --format | <format> | 输出内容:url(默认)、markdown、html 或 custom(你在 Aktar 中设置的模板)。 |
--name | <name> | 以这个名称上传单个文件。名称没有扩展名时,保留原文件的扩展名。 |
--folder | <path> | 保留文件名,上传到这个文件夹。 |
--expires | <days> | 让存储桶在 1、7、14 或 30 天后删除文件。0 表示保留。 |
--qr | 同时为每个链接输出二维码。 | |
--json | 输出包含每个上传完整信息的 JSON 数组,而不是链接。 | |
--port | <port> | Aktar 本地 API 的端口,仅对本次命令生效。优先于 AKTAR_PORT 和已保存的端口。 |
注意事项
- 上传前会先检查所有文件:只要有一个不存在,就不会上传任何文件,
aktar以退出码 2 退出。 - 某个文件上传失败时,其他文件仍会继续上传。每个失败都会输出到 stderr,退出码为 1。
- 不加
--folder时,文件名由上传目标的路径模板决定,和拖到菜单栏上传完全一样。加上--folder时,文件会保留原名放进该文件夹。 --name一次只能用于一个文件。名称中的斜杠会被移除;如果名称没有扩展名,会自动加上原文件的扩展名:--name cover会把IMG_4021.jpg上传为cover.jpg。与--folder一起使用时,它就是文件夹中的文件名。--expires接受 1、7、14 或 30(天),0 表示保留文件。不加时文件会保留,与 Aktar 中的删除时间设置无关。它需要该上传目标已设置 Aktar 的自动删除规则,且不能与--folder同时使用。--qr不能与--json同时使用,--png只能用于aktar qr。- 在终端中,上传进度会显示在 stderr 上。文件以流的方式传给 Aktar,所以文件大小不受影响,也没有时间限制。
示例
aktar upload screenshot.png
https://files.example.com/2026/10/7f3c2a91.pngaktar upload *.png -f markdown

aktar upload IMG_4021.jpg --name cover --folder blog/2026
https://files.example.com/blog/2026/cover.jpgaktar upload photo.jpg
aktar: photo.jpg: already uploaded, reused the existing link
https://files.example.com/2026/09/4d2a8c61.jpgaktar upload --clipboard
上传剪贴板中的文件或图片,效果与 Aktar 自带的剪贴板快捷键相同。
用法
aktar upload --clipboard [options]选项
| 参数 | 值 | 说明 |
|---|---|---|
--clipboard | 上传剪贴板中的内容,而不是文件。 | |
-d, --destination | <name|id> | 要上传到的上传目标,按名称或 ID 指定。默认为 Aktar 中选中的那个。 |
-f, --format | <format> | 输出内容:url(默认)、markdown、html 或 custom(你在 Aktar 中设置的模板)。 |
--expires | <days> | 让存储桶在 1、7、14 或 30 天后删除文件。0 表示保留。 |
--qr | 同时为每个链接输出二维码。 | |
--json | 输出包含每个上传完整信息的 JSON 数组,而不是链接。 | |
--port | <port> | Aktar 本地 API 的端口,仅对本次命令生效。优先于 AKTAR_PORT 和已保存的端口。 |
注意事项
- 传入文件或
--clipboard,二者只能选一。 --name和--folder只能用于文件。-d、-f、--expires、--qr和--json的用法与上传文件时相同。- 使用
--json时仍然输出数组,其中只有一项。
示例
aktar upload --clipboard
https://files.example.com/2026/10/9a4c03be.pngaktar upload --clipboard -f markdown -d Blog
aktar upload --clipboard --expires 1
https://files.example.com/tmp/1d/2026/10/38f0d7c2.pngaktar qr
在终端中显示链接或任意文本的二维码,方便在手机上打开。传入上传 ID 时,会显示该上传的链接及其二维码。
用法
aktar qr <link|text|upload-id> [--png <file>]选项
| 参数 | 值 | 说明 |
|---|---|---|
--png | <file> | 把二维码保存为 PNG 文件,而不是直接输出。 |
--port | <port> | Aktar 本地 API 的端口,仅对本次命令生效。优先于 AKTAR_PORT 和已保存的端口。 |
注意事项
- 只能传入一个参数,含空格的文本请加引号。
- 上传 ID 就是
aktar history --json或aktar upload --json输出中的id。aktar会在 Aktar 上传记录的最近 1,000 条中查找它;如果是纯文本或链接,则完全不需要 Aktar。 - 无论终端使用什么主题,二维码都以白底黑色绘制。输出不是终端或设置了
NO_COLOR时,则不使用颜色绘制。 --png会把二维码保存为 PNG,而不是直接输出。
示例
aktar qr https://files.example.com/2026/10/demo.mp4aktar qr 0B6C2F8E-3D1A-4C55-9E2B-7A41D0C3E9F1 --png cover-qr.png
Saved to cover-qr.pngaktar login
向 Aktar 验证令牌并保存,供其他命令连接时使用。
用法
aktar login [--token <token>] [--port <port>]选项
| 参数 | 值 | 说明 |
|---|---|---|
--token | <token> | 直接提供令牌,不再提示输入。 |
--port | <port> | Aktar 的端口,会与令牌一起保存。默认为 47913。 |
注意事项
- 在终端中,它会提示输入令牌,并隐藏你输入的内容。通过管道输入时,会从管道读取令牌。
--token可以跳过提示,但令牌会留在 shell 历史记录中。通过管道传入或使用AKTAR_TOKEN可以避免这一点。- 被 Aktar 拒绝的令牌不会保存,退出码为 3。
示例
aktar login
Copy the token from Aktar: Settings > Integrations (turn on Allow local connections first).
Token:
Connected to Aktar 0.10.0. Saved to /Users/you/.config/aktar/cli.jsonpbpaste | aktar login
Connected to Aktar 0.10.0. Saved to /Users/you/.config/aktar/cli.jsonaktar login --token "$AKTAR_SECRET" --port 47920
Connected to Aktar 0.10.0. Saved to /Users/you/.config/aktar/cli.jsonaktar logout
删除已保存的令牌和端口。
用法
aktar logout选项
没有选项。
注意事项
- 如果设置了
AKTAR_TOKEN,aktar logout之后它仍然有效。 - 它不会断开其他客户端。要断开它们,请在 Aktar 中重新生成令牌。
示例
aktar logout
Logged out.aktar status
aktar: Not connected to Aktar yet. Run aktar login with the token from Aktar's Settings > Integrations.aktar status
显示你连接的是哪个 Aktar、使用的端口、Aktar 中选中的上传目标,以及配置文件的位置。
用法
aktar status [--json]选项
| 参数 | 值 | 说明 |
|---|---|---|
--json | 输出 JSON 而不是文本。 | |
--port | <port> | Aktar 本地 API 的端口,仅对本次命令生效。优先于 AKTAR_PORT 和已保存的端口。 |
注意事项
- 在脚本中快速检查连接的好办法:无法连接 Aktar 或令牌不正确时,退出码为 3。
示例
aktar status
Aktar 0.10.0 (build 28) on port 47913
Destination: Screenshots (Cloudflare R2, screenshots)
Config: /Users/you/.config/aktar/cli.jsonaktar status --json
{
"app": "Aktar",
"version": "0.10.0",
"build": "28",
"apiVersion": 1,
"defaultDestinationId": "5D1A9C3E-7B2F-4E61-8A0D-3C9B6F2E1A47",
"outputFormat": "url",
"port": 47913
}aktar destinations
列出你的上传目标及其服务商、存储桶和 ID。* 标出 Aktar 中当前选中的那个。
用法
aktar destinations [--json]选项
| 参数 | 值 | 说明 |
|---|---|---|
--json | 输出 JSON 而不是文本。 | |
--port | <port> | Aktar 本地 API 的端口,仅对本次命令生效。优先于 AKTAR_PORT 和已保存的端口。 |
注意事项
-d可以使用名称或 ID。名称匹配不区分大小写;ID 始终有效,即使改了名也一样。--json会为每个上传目标给出id、name、provider、providerName、bucket、publicBaseURL和isDefault。
示例
aktar destinations
* Screenshots Cloudflare R2 screenshots 5D1A9C3E-7B2F-4E61-8A0D-3C9B6F2E1A47
Builds Amazon S3 acme-builds A83F2C10-6D4B-4F7E-9C1A-2B5E8D0F3C66
Blog Backblaze B2 blog-assets E2C7B9A4-1F3D-4A8E-B6C0-9D5F2A7E4B13aktar destinations --json | jq -r '.[] | select(.isDefault) | .name'
Screenshotsaktar history
按从新到旧列出最近的上传:日期、文件名和链接。history 后面的词会用来搜索上传记录。
用法
aktar history [search] [options]选项
| 参数 | 值 | 说明 |
|---|---|---|
-n, --limit | <n> | 要列出的上传条数。默认为 20。 |
-d, --destination | <name|id> | 只显示上传到这个上传目标的记录,按名称或 ID 指定。 |
--json | 输出 JSON 而不是文本。 | |
--port | <port> | Aktar 本地 API 的端口,仅对本次命令生效。优先于 AKTAR_PORT 和已保存的端口。 |
注意事项
- 默认列出 20 条,可用
-n修改。 --json给出的字段与aktar upload --json相同,包括每个上传的id,可用于aktar qr。
示例
aktar history -n 3
2026-10-01 screenshot.png https://files.example.com/2026/10/7f3c2a91.png
2026-10-01 cover.jpg https://files.example.com/blog/2026/cover.jpg
2026-09-30 invoice-september.pdf https://files.example.com/2026/09/0e7d51b3.pdfaktar history invoice -d Screenshots
2026-09-30 invoice-september.pdf https://files.example.com/2026/09/0e7d51b3.pdf
2026-08-29 invoice-august.pdf https://files.example.com/2026/08/a6c94f20.pdfaktar history -d Builds -n 1 --json | jq -r '.[0].url'
https://acme-builds.s3.amazonaws.com/2026/10/app-3f9c2e1.zip所有命令通用的选项
| 参数 | 值 | 说明 |
|---|---|---|
-h, --help | 显示命令和选项列表。 | |
-v, --version | 显示 aktar 的版本。 | |
--port | <port> | Aktar 本地 API 的端口,仅对本次命令生效。优先于 AKTAR_PORT 和已保存的端口。 |
输出
格式
-f 决定每个上传输出什么内容。不加时,无论 Aktar 菜单栏拷贝的是哪种格式,aktar 都输出纯 URL。Markdown 和 HTML 会把图片嵌入,其他文件则输出链接,与 Aktar 的做法一致。
| 格式 | photo.jpg 的输出 |
|---|---|
-f url | https://files.example.com/2026/10/7f3c2a91.jpg链接(默认)。 |
-f markdown | Markdown 图片;其他文件为 Markdown 链接。 |
-f html | <img src="https://files.example.com/2026/10/7f3c2a91.jpg" alt=""><img> 标签;其他文件为 <a> 链接。 |
-f custom | 你在 Aktar 设置中的模板,{url}、{filename} 等变量会被替换。 |
stdout 和 stderr
标准输出只有链接,每行一个,顺序与文件一致(使用 --qr 时还有二维码)。其他内容都输出到标准错误:进度、错误,以及 aktar: photo.jpg: already uploaded, reused the existing link 这样的提示。所以 url=$(aktar upload file) 和 aktar upload *.png > links.txt 得到的始终是干净的链接。
aktar upload photo.jpg
aktar: photo.jpg: already uploaded, reused the existing link
https://files.example.com/2026/09/4d2a8c61.jpgJSON
--json 会在所有文件完成后输出一个数组,每个上传的文件一项。上传失败的文件不在其中(它们会输出到 stderr),所以也要检查退出码。
aktar upload photo.jpg --json
[
{
"id": "0B6C2F8E-3D1A-4C55-9E2B-7A41D0C3E9F1",
"filename": "photo.jpg",
"objectKey": "2026/10/7f3c2a91.jpg",
"url": "https://files.example.com/2026/10/7f3c2a91.jpg",
"destinationId": "5D1A9C3E-7B2F-4E61-8A0D-3C9B6F2E1A47",
"destinationName": "Screenshots",
"mimeType": "image/jpeg",
"size": 482113,
"createdAt": "2026-10-01T12:00:00Z",
"expiresAt": null,
"formats": {
"url": "https://files.example.com/2026/10/7f3c2a91.jpg",
"markdown": "",
"html": "<img src=\"https://files.example.com/2026/10/7f3c2a91.jpg\" alt=\"\">",
"custom": ""
},
"reused": false
}
]| 字段 | 含义 |
|---|---|
id | 该上传在 Aktar 上传记录中的 ID,可用于 aktar qr。 |
filename | Aktar 记录的文件名:文件本身的名称,或 --name 指定的名称。 |
objectKey | 文件在存储桶中的位置。 |
url | 链接。 |
destinationId | 上传目标的 ID。 |
destinationName | 上传目标的名称。 |
mimeType | 文件类型,以 Aktar 转换后的为准。 |
size | 存储后的大小,单位为字节。 |
createdAt | 上传时间(ISO 8601,UTC)。 |
expiresAt | 存储桶删除它的时间;如果会保留,则为 null。 |
formats | 全部四种格式的链接:url、markdown、html 和 custom。 |
reused | 因为同一文件已经存在而没有上传时为 true。Mac 0.10.0 和 Windows 0.3.0 之前的 Aktar 不会返回此字段。 |
退出码
| 代码 | 含义 |
|---|---|
0 | 一切正常。 |
1 | 至少有一个上传或请求失败,其余仍已完成。Aktar 自身的错误(例如未设置自动删除)也属于这一类。 |
2 | 参数有误、文件不存在,或 Aktar 中没有这个名称的上传目标。没有上传任何文件。 |
3 | 尚未登录、Aktar 没有运行、本地 API 已关闭,或令牌不正确。 |
实用示例
拷贝、改一下文件名,就能用。每个示例都只用到上面介绍过的内容。
把链接存入变量
只有链接会进入标准输出,所以命令替换得到的正好是 URL。上传失败时,|| exit 1 会终止脚本。
url=$(aktar upload build/report.pdf) || exit 1
echo "Report: $url"
Report: https://files.example.com/2026/10/0e7d51b3.pdf上传构建并发布链接
把构建打包成 zip,以提交的短哈希为名上传到名为 Builds 的上传目标,再把链接发到任何接受 JSON 的 webhook(聊天频道、问题追踪系统或你自己的接口)。上传失败时,set -e 会在发布前终止。
#!/bin/sh
set -e
zip -qr app.zip dist
url=$(aktar upload app.zip -d Builds --name "app-$(git rev-parse --short HEAD)")
curl -fsS -X POST "$WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d "{\"text\": \"New build: $url\"}"Makefile 目标
make share 以当天日期为名上传报告,并把链接保存在 .last-link 中。在 Makefile 中,$$ 会把 $ 传给 shell,命令行必须以制表符开头。
share: dist/report.pdf
aktar upload dist/report.pdf --name "report-$$(date +%F)" | tee .last-linkTypora 图片上传
在 Typora 中打开偏好设置 > 图像,把图片上传服务设为自定义命令,填入 aktar 的完整路径(即 which aktar 输出的路径),后面加上 upload。Typora 会传入图片路径,并逐行读取链接。
/opt/homebrew/bin/aktar upload包含插入图片时…设置的详细步骤:Typora 图床:图片自动上传到 S3。
从访达或快捷指令上传
在 Mac 上,向快捷指令或在访达中接收文件的 Automator 快速操作添加 Run Shell Script 操作,并把输入设为 as arguments。快捷指令和 Automator 不会加载 shell 的 PATH,所以需要第一行。选中文件并运行,链接就会出现在剪贴板上。
export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH"
aktar upload "$@" | pbcopy
osascript -e 'display notification "Link copied" with title "aktar"'它上传的是文件,不是文件夹。选中多个文件会得到多个链接,每行一个。
临时文件
日志、录屏或任何不该长期保留的文件,都可以交给存储桶删除。上传目标需要先设置 Aktar 的自动删除规则:在 Aktar 菜单栏的删除时间或上传目标的设置中设置一次即可。
aktar upload crash.log --expires 1
aktar upload screen-recording.mov --expires 7 --qr限期文件存放在存储桶中的 tmp/1d/、tmp/7d/ 等文件夹下,即使 Aktar 没有运行,存储桶也会删除它们。
在手机上打开链接
--qr 会在链接下方输出二维码,用手机相机对准终端即可。之后想再次显示,把上传的 ID 传给 aktar qr,这里用的是匹配 "demo" 的最新上传。
aktar upload demo.mp4 --qr
aktar qr "$(aktar history demo -n 1 --json | jq -r '.[0].id')"Windows PowerShell
同样的用法也适用于 PowerShell。$LASTEXITCODE 保存退出码,ConvertFrom-Json 可以读取 --json 的输出。
$url = aktar upload .\dist\app.zip -d Builds
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
Set-Clipboard $url
$upload = aktar upload .\report.pdf --json | Out-String | ConvertFrom-Json
$upload.formats.markdownAktar 替你做的事
CLI 只负责转交文件,其余都由 Aktar 按每个上传目标的设置完成。所以你在应用中设置的一切同样适用于 aktar upload,无需额外选项,得到的链接也对应最终存储的文件。
-
路径模板
文件名由上传目标的对象路径决定,可以使用
{year}、{uuid}、{filename}等变量。{md5}和{sha256}按文件内容命名。 -
图像处理
如果上传目标会把图像转换为 WebP 或 AVIF、压缩或调整大小,CLI 上传的图像也会同样处理,链接指向转换后的文件。
-
照片元数据
上传目标的上传默认设置中的图片元数据会在照片离开你的电脑前移除位置信息,或移除全部元数据。
-
同一文件,同一链接
开启重复文件复用链接后,同一上传目标中内容相同的文件会直接得到现有链接,不会再上传一次。
aktar会在 stderr 上提示。 -
大文件
大文件会分段上传,没有 5 GB 上限,连接中断后会重试,并从中断处继续。
aktar以流的方式把文件传给 Aktar,从不把整个文件读入内存。 -
公开链接或临时链接
链接是公开链接,还是同样适用于私有存储桶的临时(预签名)链接,与在应用中一样由上传目标决定。
重复文件复用链接、图像处理、{md5} 和 {sha256} 以及分段上传随 Aktar for Mac 0.10.0 和 Windows 0.3.0 推出:0.10.0 新功能。
问题排查
aktar 的错误信息以 aktar: 开头,并输出到 stderr。退出码可以告诉你是哪一类问题。
Aktar isn't running, or its local API is turned off
打开 Aktar,确认设置 → 集成中的允许本地连接已开启。如果你在那里改过端口,请用 --port 或 AKTAR_PORT 传入,或重新运行 aktar login --port。退出码 3。
Not connected to Aktar yet
没有已保存的令牌,也没有设置 AKTAR_TOKEN。用 Aktar 设置 → 集成中的令牌运行 aktar login。退出码 3。
The token doesn't match Aktar's anymore
令牌已在 Aktar 中重新生成,或输入有误。用当前的令牌重新运行 aktar login。如果设置了 AKTAR_TOKEN,它会优先于已保存的令牌,所以也要更新或取消设置它。退出码 3。
Auto-delete isn't set up for this destination
--expires 需要存储桶的自动删除规则。在 Aktar 菜单栏的删除时间或上传目标的设置中设置一次,或者不加 --expires 上传。退出码 1。
No destination named "…"
错误信息会列出 Aktar 中已有的名称。检查拼写,含空格的名称请加引号(-d "Client work"),或使用 aktar destinations 显示的 ID。退出码 2。
大文件上传很慢
这取决于存储服务商的速度:aktar 对上传没有时间限制,并会在终端的 stderr 上显示进度。在完成之前请保持 Aktar 运行。如果连接中断或 Aktar 退出(Aktar closed the connection before the request finished),再次上传同一文件即可:Aktar for Mac 0.10.0 和 Windows 0.3.0 会从最后一个分段继续。
aktar 无法启动:SyntaxError 或 parseArgs
你的 Node.js 版本低于 18。用 node --version 检查并更新,或者用 Homebrew 安装 aktar,它会自带 Node.js。
PowerShell 提示禁止运行脚本
PowerShell 的执行策略阻止了 npm 为 aktar 安装的脚本。改为运行 aktar.cmd,或用 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 一次性允许本地脚本。