---
title: 网页终端：在电脑浏览器里用 Agent J 主机的命令行
nav: 网页终端
summary: 在电脑浏览器里开一个限时的终端，像云服务后台的网页终端一样在 Agent J 主机上敲命令；默认关，在「设置」→「安全」里用 Face ID 加电脑密码就能开启，手机上不能用；每次打开都要 Face ID；聊天里用`!`运行命令，扫脸填入电脑密码。
order: 50
---
# 网页终端：在电脑浏览器里用 Agent J 主机的命令行

网页终端让你在电脑浏览器里用 Agent J 主机（装着 Agent J 的那台电脑）的命令行，就像云服务后台里的网页终端：你在浏览器里敲一行命令，主机运行它，结果显示在浏览器里。它在「设置」→「安全」→「网页终端」里。

它只能在电脑浏览器里用，也就是在电脑浏览器里打开的遥控器。手机上只显示一句：「因为安全性和便捷性的原因，网页终端只能在电脑浏览器里操控。」

它默认是关的。开启要你本人确认：在电脑浏览器里用 Face ID 加 Agent J 主机的登录密码，或者在主机上运行一条命令。Agent、定时任务和脚本都开不了。每次打开都要用 Face ID 确认，默认最长 15 分钟，全程录像。

开启以后，你还可以在聊天里直接用`!`开头运行命令（[详见](#bang)）；让电脑记住电脑密码，之后扫脸就能填入，Agent 的管理员命令卡上也能用（[详见](#computer-password)）；还可以让 Agent 帮你打开终端、填好命令，或者读取终端的输出（[详见](#agent)）。

## 在哪里找 {#where}

打开「设置」→「安全」，「网页终端」这一行一直都在，按情况写着下一步：

- **电脑浏览器，还没开启或这个浏览器还不能用**：点「开启并打开网页终端」，见[在电脑浏览器里开启](#enable-browser)。下面「也可以在 Agent J 主机上运行下面这行：」写着 `agentj terminal enable`，点旁边的按钮就能复制（[详见](#enable)）。
- **手机**：只写着「因为安全性和便捷性的原因，网页终端只能在电脑浏览器里操控。」，没有按钮。
- **Agent J 主机是 Windows（不在 WSL 里）**：写明这台电脑的系统暂不支持，下一版支持；现在支持 Linux、macOS 和 Windows 的 WSL。
- **这台设备还没设 Face ID**：先点「设置 Face ID」。
- **只写着一行命令、没有开启按钮**：这台遥控器配对时没记下它是电脑还是手机（比如配对得很早）。重新配对这台遥控器，就能直接在这里开启；也可以在 Agent J 主机上运行写着的那行命令，见 [谁能用](#who)。
- **已开启，这个浏览器也能用**：点「打开网页终端」。

## 在电脑浏览器里开启 {#enable-browser}

1. 在电脑浏览器里打开遥控器，到「设置」→「安全」→「网页终端」点「开启并打开网页终端」。
2. 用 Face ID 确认。
3. 输入一次 Agent J 主机的登录密码，就是你登录那台电脑、用 sudo 时输入的密码。主机用 sudo 核对它；开启时每次都要亲手输入，不用记住的密码。
4. 密码对了，网页终端就为这个浏览器开启，并马上打开：你离开「设置」，在这个窗口里全屏使用它，点右上角的 ✕ 收起（[详见](#full-screen)）。

开启后，所有遥控器都会收到一条通知，写明是在哪台设备上开启的。这台是网页版遥控器时，通知里还会写：不是你本人开启的话，立刻在 Agent J 主机上运行 `agentj terminal disable`。

浏览器判断你用的是电脑还是手机，只是为了把你带到对的地方。Agent J 主机自己也会按配对时记下的设备类型，拒绝配对成手机的遥控器打开或开启网页终端。真正保护你的是这几道门：签名、Face ID、电脑登录密码、全程录像和时间限制。

## 在 Agent J 主机上开启 {#enable}

另一种开启方式：在 Agent J 主机自己的终端里运行：

```bash
agentj terminal enable
```

1. 主机上会显示一串 6 位对照码，同时你已配对的遥控器（包括手机）都会收到一张确认卡片，卡片上写着能用的设备、每次最长几分钟，以及同一串对照码。
2. 核对两边的数字一样，再在一台设了 Face ID 的遥控器上点允许，用 Face ID 确认。5 分钟内没人确认，就什么都不改。
3. 确认后，名单上那个电脑浏览器的「设置」→「安全」里出现「打开网页终端」。

要求：

- 至少一台已配对的电脑浏览器设了 Face ID（或指纹，也就是通行密钥）。还没设的，先在它的「设置」→「安全」→「网页终端」点「设置 Face ID」。
- 支持 Linux、macOS 和 Windows 的 WSL；Windows 本身还不支持，留到下一版。Mac 上另有几条，见 [在 Mac 上](#macos)。
- 你的电脑账户要能用 sudo，而且 sudo 要输密码。sudo 不用密码（NOPASSWD）或者账户不是管理员，`agentj terminal enable` 会直接拒绝并说明原因：网页终端要拿电脑登录密码当第二道锁。

这条命令只能由你在自己的终端里亲手运行。Agent、定时任务、脚本，还有网页终端本身，都开不了它。遥控器只能用「开启并打开网页终端」为它自己开启，还要 Face ID 和电脑登录密码；手机开不了。

有好几台设了 Face ID 的电脑浏览器时，用 `--device` 选一台（可以写多次；配对成手机的遥控器选不了）；每次最长几分钟用 `--minutes` 改，默认 15，最多 60：

```bash
agentj terminal enable --device <设备> --minutes 30
```

`agentj terminal status` 列出开关、名单上的设备和每台是否记住了电脑密码。

## 在 Mac 上 {#macos}

Agent J 主机是 Mac 时，网页终端和 Linux 上一样：同样要你本人开启、每次打开都要 Face ID、有时间限制、全程录像、危险命令要再确认、敲的命令照样先遮挡再记录。几点不同：

- 开启前还要满足三条，不满足时会直接说明原因：你的 Mac 账户是管理员（系统设置 → 用户与群组里写着管理员）；sudo 没有开启 Touch ID 或 Apple Watch 验证，不然 sudo 会在 Mac 屏幕上等你按指纹，远程永远等不到；装了命令行开发工具（在 Mac 上运行 `xcode-select --install`），网页终端里的 sudo 才能安全地用记住的电脑密码。没装的话终端照样能用，只是 sudo 会说明原因并拒绝运行。
- 终端用你的登录 shell：默认是 zsh；登录 shell 是 bash 的，就用系统自带的 bash。它不读 `~/.zshrc`、`~/.bash_profile` 这些启动文件，所以里面的别名和函数没有；常用路径（包括 Homebrew 的 `/opt/homebrew/bin`）都在 PATH 里，文字按 UTF-8 显示。
- 命令历史只存在 Agent J 的数据目录里，不写进 `~/.zsh_history`。看起来像密码、密钥、令牌的行，和以空格开头的行，都不进历史。
- Mac 上没有 Linux 那样的隔离运行空间。终端以你本人的身份运行，不是 Agent，也不受 Agent 的隔离限制；保护它的是前面那几道门。

## 谁能用 {#who}

名单上的设备才能打开网页终端。开启时选的那台，或者在浏览器里自己开启的那台，是你自己的。

请朋友（比如一位工程师）帮忙时，不要把你的设备交给他。让他在自己电脑的浏览器里配对成一台遥控器，并设好他自己的 Face ID，然后你在 Agent J 主机上临时允许这一台：

```bash
agentj terminal allow <设备> --hours 2
```

`--hours` 可以填 1 到 24，默认 2，到时间自动取消。临时允许的设备不会记住电脑密码，每次打开都要重新输入一次。用 `agentj terminal deny <设备>` 可以提前把它从名单上去掉。配对成手机的遥控器不能被允许。

**网页版遥控器**要多加 `--allow-web`。这种设备的「网页终端」那一行会写「这台设备是网页版」。原因：网页版的页面如果被篡改，可能借用你的 Face ID。确认卡片上也会写明这一点。

```bash
agentj terminal allow <设备> --allow-web
```

## 打开和输入密码 {#open}

1. 在电脑浏览器里，到「设置」→「安全」→「网页终端」点「打开网页终端」，再点「用 Face ID 确认」。**每次打开都要 Face ID**，不会因为刚用过就跳过。
2. 在一台设备上第一次打开时（除非这台已经能扫脸填入，见[下文](#computer-password)），终端页里会出现「输入电脑的登录密码」。这就是你登录 Agent J 主机、用 sudo 时输入的那个密码。它在浏览器里加密后才发出，只有 Agent J 主机能解开；它不会显示，也不会留在这台设备上。点「用 Face ID 发送」。
3. 主机核对密码，对了就打开终端，顶上显示当前目录、剩余时间和「录像中」。

密码输错：同一台设备连错 3 次锁 15 分钟；整台主机一小时内错 10 次锁 1 小时。每次输错，所有遥控器都会收到提醒。电脑系统自己可能也会把这些错误计入它的锁定次数（比如 Linux 的 pam_faillock），连错太多次，可能连电脑本身的登录也会被暂时锁住。

### 电脑密码怎么保存 {#password-modes}

电脑会按下面三种方式之一保存密码，「设置」里的那一行会用大白话写明是哪一种：

| 方式 | 设置里怎么写 | 什么时候用 |
|---|---|---|
| 扫脸才能解开 | 电脑密码已加密保存，只有你扫脸才能解开。 | 这台设备的 Face ID 支持这项能力时（优先） |
| 电脑本机加密 | 电脑密码已加密保存在电脑上，扫脸后电脑才使用它。 | 设备不支持上一种，且「隔离运行」开着、「会话模式」是「独立会话」时 |
| 只在这一次 | 每次打开都要输入电脑密码，用完即清除。 | 其他情况，以及朋友临时允许的设备 |

这几种方式能防什么、不能防什么：

- 前两种：**防备份、离线拷贝和 Agent 直接读盘；不防能改 Agent J 代码或用户服务的程序。** 密码文件加了密，拷走、备份走都打不开，Agent 直接去读也读不到明文。但同一台电脑上，如果有程序能改 Agent J 自己的代码或你的用户服务，它就能在密码被用到的那一刻拿到它。
- 电脑本机加密只在「隔离运行」开着、「会话模式」是「独立会话」时才能用；你一关隔离或改成共享会话，这份密码立刻删除，下次打开重新输入。
- 只在这一次：密码只在电脑上的 Agent J 内存里，终端关掉就清除，硬盘上不留。

想让电脑对这台设备忘掉密码，在「设置」→「安全」→「电脑密码」点「清除这台」；想删掉所有记住的密码，在电脑上运行 `agentj terminal forget`。你在电脑上改了登录密码以后，旧的那份在下次被 sudo 拒绝时自动删除，下次打开时再输一次新密码就好。

## 电脑密码：输一次，以后扫脸 {#computer-password}

上面第一种方式就是一个小小的密码保险箱。电脑密码只以加密形式存在电脑上，从不存在遥控器上；每台设备用自己的 Face ID 或指纹来解开。

- **在一台设备上第一次用**：输一次密码（在终端里，或在管理员命令卡上）。之后这台设备扫脸就能填入。
- **换一台设备**：在那台设备的「设置」→「安全」→「电脑密码」点「让这台也能用」，先用 Face ID 确认，再在 2 分钟内到一台已经能用的设备上点「用 Face ID 同意」。那张卡片上写着新设备的名字、设备编号、通行密钥、配对日期和类型：只在你认得这台设备时同意。同意后所有遥控器都会收到提醒。也可以直接在新设备上输一次密码。
- **Agent 的管理员命令卡（sudo）**：点「用 Face ID 填入电脑密码」；或者点「或者输入电脑密码」，并勾选「用 Face ID 记住（下次扫脸即可）」。密码只用于这一条命令，Agent 拿到的是命令的输出，不是密码。手机上的管理员命令卡也能这样用。
- Face ID 不支持这项能力的设备（设置里会写明），以及临时允许的设备，每次都要输入密码。
- 你改过密码时，卡片上会写「记住的电脑密码不对了（可能改过），请输入一次。」这不算输错密码。

它能防的和上面一样：**防备份、离线拷贝和 Agent 直接读文件；不防能改 Agent J 代码或用户服务的程序。**

「设置」里的「电脑密码」那一行写着这台设备能不能用；「清除这台」只取消这一台的使用权。

## 怎么敲命令：行模式 {#line-mode}

第一版是**行模式**：你在浏览器里写好一整行，点「发送」，主机才运行。

- 一行最多 4096 字节，不能有 Tab 和换行。没有 Tab 补全。
- 控制键只有两个：Ctrl+C（中断正在运行的程序）和 Ctrl+\（强制退出它）。没有 Ctrl+D、Ctrl+Z。
- 不能用全屏程序，比如 `vim`、`top`、`less`。要看文件用 `cat`、`head`、`tail`。
- 有的程序发现输出不是屏幕，会攒够一大块才一起显示，看上去像卡住。可以在命令前加 `stdbuf -oL`，让它一行一行地输出。
- 错误信息和普通输出按顺序混在一起显示。颜色等控制字符会去掉，看起来像密码、密钥的内容会先在主机上遮住再发到浏览器。输出太快时，多出来的部分会省略，并写明省略了多少字节。
- 浏览器只把输出放在内存里，关掉就没了，不存到这台设备上。

### 不要在终端里输入密码 {#no-passwords}

网页终端不是真正的屏幕，程序要密码时（比如 `ssh`、`git` 要账号密码，`passwd`），它读到的就是你发的下一整行**明文**。所以**不要在这里输入任何密码**。输入框下面也有这句提示。

`sudo` 是例外：你在终端里用 `sudo`，页面上会弹出「用 Face ID 允许 sudo」，写明 sudo 实际要运行的命令和你敲的那一行；两者不一样时会特别提醒。点「用 Face ID 允许」，主机把记住的密码交给这一次 sudo；点「不允许」，sudo 就失败。60 秒内不答也算不允许。密码从来不会出现在你发的命令里。

程序正在运行时你发的行，会交给那个程序。这样的行在录像里只留一句占位说明，不记内容，也不进命令历史。

网页终端自己的命令历史只存在主机上（只有你能读）。行首带空格的行、和上一行重复的行，以及看起来在设置密钥或密码的行（比如 `TOKEN=…`、`--password=…`、`Bearer …`、`https://用户名:密码@…`）都不会留下；你平时用的终端的历史不会被读取，也不会被复制过来。

### 危险命令要再确认一次 {#confirm}

每一行发出前，主机都会先看一遍。删除文件这类高风险命令，还有直接起一个新的 shell 或解释器、运行脚本文件、`ssh`、`su`、`source`、`eval` 这一类，会先弹「这一行要你确认」，写明原因。点「运行」并用 Face ID 确认才执行；不点，或 120 秒内没确认，就不执行。这种确认只能由正在用终端的这台设备来点，任何自动批准都不适用。

老实说：**这一步只防手滑，不防已经拿到会话的人。** 一条命令可以拆成好几行拼出来，比如先存成变量、写进文件再运行，主机不一定认得出来。真正保护你的是前面那几道门：开启要你本人确认、名单、每次 Face ID、时间限制和全程录像。

## 什么时候会自动关 {#limits}

出现下面任何一种情况，终端就关掉，并停下它里面还在运行的所有命令：

- 到了时间上限（默认 15 分钟，在主机上开启时用 `--minutes` 改，最多 60）。
- 5 分钟没有发任何一行。
- 浏览器切到别的标签页或最小化超过 60 秒。
- 连接断了。
- 你点了「全部停下」，或主机上的 Agent J 停了。
- 你在主机上运行了 `agentj terminal disable`，或用 `deny` 把这台设备去掉。
- 你点了「结束」。

打开和关闭时，所有遥控器都会收到一条通知，写明原因和用了几分钟。同一时间只能有一台设备在用网页终端。

## 全屏、收起、复制和截屏 {#full-screen}

终端打开后是全屏的：深色底、浅色字。从「设置」里打开时，你会离开设置页，在这个窗口里全屏使用它。（这里说的是页面全屏；`vim` 这类全屏程序仍然不能用。）

- **收起**：点右上角的 ✕，按 Esc，或者把顶部的小横条往下拉。双击什么都不会发生，免得打扰正在运行的程序。
- **收起不等于结束。** 终端照样运行，时间限制不变，消息框上方会出现「终端 · 剩 N 分钟」，点「打开」就回来。弹出 sudo 或确认卡片时，终端会自己回到全屏。
- 「复制输出」：复制页面上的输出。
- 「截屏发到聊天」：把屏幕上看得到的输出画成一张图，放进附件；你点发送才会发出去。
- 点「结束」才会关掉终端。

## 在聊天里用`!`运行命令 {#bang}

在电脑浏览器的消息框里先打 `!`，再接命令，比如 `!df -h`，然后发送。它不会当成聊天发给 Agent J，而是作为一行命令在网页终端里运行。

1. 这台设备的终端没开时，会先请你用 Face ID 打开它，打开后收在后台。
2. 聊天里出现一张结果卡片，显示输出；输出长时点「展开全部」。
3. 命令和输出随后交给 Agent J，它会接着处理。

上面的规矩全都照旧：危险的行要确认，sudo 要 Face ID，时间限制和录像不变。同一时间只运行一条`!` 命令；120 秒还没运行完，卡片先显示到那时为止的输出。

终端没开启，或这台设备不在名单上时，会弹出一张卡片写明怎么开启；在手机上，卡片说明网页终端只能在电脑浏览器里操控。只想发一句以 `!` 开头的普通消息，就在`!` 前面加一个空格。`!` 只在 Agent J 的 App 和网页里有用，Telegram、邮件里不算。

### 哪些内容会交给 AI {#what-the-ai-sees}

`!` 命令的输出，以及 Agent 用 `agentj terminal output` 读到的内容，会进 Agent 的对话，也就会发给你用的 AI 模型服务商。发出之前，电脑会再遮一遍：KEY、TOKEN、SECRET、PASS 这类名字后面的值，`-p` 或 `--password` 后面的那个词，链接里的密码。卡片上会写遮了几处，比如「已隐藏 3 处像密码或密钥的内容」。

这种遮挡并不完美：它会多遮一些无害的东西（比如 `mkdir -p dir` 里的 `dir`），也可能漏掉格式少见的密钥。所以**不要在终端里打印密码或密钥**（比如别 `cat .env`）。

## 录像 {#recording}

每次使用都会录下来：遮挡过的输出和你发的每一行（同样先遮挡）。录像存在主机上 Agent J 的数据目录里，只有你的电脑账户能读，保留 30 天后自动删除。录像不上传到任何地方，也不会进客服报告。操作记录里另外记下哪台设备、什么时候打开和关闭，以及确认过的危险命令和 sudo，这些只记摘要，不记命令原文。

在主机上看最近的记录和录像文件名：

```bash
agentj terminal logs
```

## 它不是断线时的备用通道 {#not-a-fallback}

网页终端走的是遥控器和 Agent J 主机之间同一条加密连接。连接断了，它也用不了。遥控器连不上主机时，用这些办法：

- 遥控器上的「紧急修复」，按 ① ② 的顺序试。
- 在主机上运行 `agentj doctor --reconnect`。
- 请主机旁边的人运行 `curl -fsSL https://agentj.app/rescue | sh`。

详见 [手机显示灰色或断开怎么办](/docs/reconnect/)。

「紧急修复」下面「Agent J 主机上的命令」里的每条命令，在终端开启且这台设备在名单上时，旁边会多一个「在终端里打开」：它把这条命令填进网页终端，你按回车才运行。

## 关掉和收回 {#turn-off}

- 关掉整个功能，同时删掉所有记住的密码：

```bash
agentj terminal disable
```

- 把一台设备从名单上去掉：

```bash
agentj terminal deny <设备>
```

- 只删掉记住的电脑密码，名单不变：

```bash
agentj terminal forget
```

解除一台遥控器的配对，或删掉它的 Face ID，它也会自动从名单上去掉，记住的密码一起删除。

## 借朋友电脑救急 {#borrowed-computer}

Agent J 主机不能随身带，但浏览器到处都有。急着要在主机上敲几条命令时，可以临时借一台电脑的浏览器，用完解绑：

1. **扫码配对**：在借来的电脑上用浏览器打开遥控器网页，让它亮出配对二维码；拿你已配对的手机扫这个码，核对两边的 6 位对照码一致后确认。详见 [被扫码配对](/docs/phone/#被扫码配对-新设备亮码-已配对的手机来扫)。
2. **设 Face ID**：在这个浏览器里点「设置 Face ID」。朋友的电脑没有指纹时，按浏览器的提示改用你的手机确认。
3. **开启并打开**：在这个浏览器的「设置」→「安全」→「网页终端」点「开启并打开网页终端」，用 Face ID 确认，再输入一次 Agent J 主机的登录密码。见[在电脑浏览器里开启](#enable-browser)。
4. **用**：敲完命令点「结束」。
5. **解绑**：在你的手机上打开「遥控器管理」，把这台「解绑」。解绑的那一刻，它正开着的网页终端立刻关掉，里面还在运行的命令一起停下；它从名单上去掉，记住的电脑密码一起删除；之后这个浏览器再也打不开网页终端，要用只能重新配对。

还电脑之前，顺手清掉这个浏览器里遥控器网页的网站数据；不要让浏览器记住 Agent J 主机的密码。

## Agent 能做什么 {#agent}

Agent 永远不能往终端里打字、发送命令，也不能打开网页终端的开关。它只能做两件事：

- **帮你打开终端、填好命令。** 需要你亲自运行某条命令时（比如一条 sudo 命令），Agent 可以在你名单上、正在线的设备上打开终端（配对成手机的遥控器除外），命令已经填在输入框里：「Agent J 填好了一条命令，看清楚后按回车运行。」终端没开时，照样要你用 Face ID 打开。你已经在输入框里打了字的话，Agent 的命令会先放在一个小条里，等你点了才放进去。Agent 填的命令一字没改就发送时，页面总会再问一次「这条命令由 Agent 填写」，要 Face ID 确认。
- **读取输出。** 不用你复制粘贴，Agent 可以读当前这次终端的命令和输出，或者上一次的（关闭后 30 分钟内）。这些只放在主机内存里，遮挡方式和[哪些内容会交给 AI](#what-the-ai-sees) 一样。你输给正在运行的程序的内容不在里面，临时允许的设备用的那次终端也不在里面。终端页上写着：「Agent J 能读到这里的输出，密码和密钥会被隐藏。」

Agent 在处理不是你发来的消息时（群聊、转发、好友），这两件事都做不了。Agent 用密钥卡向你要电脑登录密码或 sudo 密码，会被拒绝。

更多命令和参数见 [agentj 命令参考](/docs/cli/)。遥控器上其他设置见 [使用手册](/docs/manual/)。
