背景:terminal 工具是什么
OpenClaw 的 exec 工具能跑 shell,但它跑的是AI 自己开的、无头后台的命令。有些场景你(人类)在控制面板(Control UI)里手动开了一个终端,正盯着它跑一个长任务,或者想让 AI 帮你读一下那个终端现在卡在哪、顺手敲个命令进去——这时候用的是另一个工具:terminal。
terminal 和你自己开的终端会话是同一个,AI 能看、能写、但不能随便替你新建 shell(新建 shell 是 exec 的事)。边界很清晰:terminal = 管理人类已开的终端;exec = AI 自己跑命令。
它能干什么
| 动作 | 说明 |
|---|---|
list |
列出当前所有人类在控制面板开的终端会话 |
read |
读取某个会话的缓冲区快照(当前屏幕内容) |
resize |
调整终端行列数(cols/rows) |
close |
关闭某个终端会话 |
input |
向终端发送输入(需要一次性操作员授权,除非执行策略放行) |
注意:input 往终端里塞按键属于敏感动作。默认需要你这一侧一次性批准,不能绕过。这是安全护栏,不是 bug。
实战一:先列出有哪些终端
# 让 AI 跑 list,等价于你在代码里调用 terminal action=list
返回的是一个会话列表,每条带 sessionId、cols、rows、以及最后活动信息。拿到 sessionId 才能对单个终端做后续操作。
实战二:读一下某个终端现在在干嘛
假设你开了一个终端正在编译,半小时没动静,怀疑卡死:
{
"action": "read",
"sessionId": "t-abc123"
}
返回的是缓冲区快照——你能看到最后几屏输出,比如停在某行 make[2]: Entering directory 或者一个未结束的进度条。结合 exec 里 ps aux | grep make 就能判断是真忙还是真卡。
实战三:往终端里敲命令
常见用法:终端卡在某个交互式提示(比如 Do you want to continue? [Y/n]),你又懒得切窗口:
{
"action": "input",
"sessionId": "t-abc123",
"data": "Y\n"
}
data 是字面量字符串,末尾的 \n 代表回车。AI 不会帮你瞎按回车,必须显式带 \n,这也是护栏的一部分——避免误触。
需要粘贴多行?用 bracketed 模式包起来,终端会当成一次粘贴而非逐字符输入:
{
"action": "input",
"sessionId": "t-abc123",
"data": "sudo systemctl restart nginx\n",
"bracketed": true
}
实战四:调整尺寸避免输出错乱
有的 TUI 程序(htop、vim、tmux)对终端尺寸敏感。如果你在手机上开的窄终端里跑 htop 显示乱了,可以让 AI resize:
{
"action": "resize",
"sessionId": "t-abc123",
"cols": 200,
"rows": 50
}
实战五:收尾关掉终端
长任务跑完、确认不需要了,让 AI 关掉,别让会话堆着:
{
"action": "close",
"sessionId": "t-abc123"
}
和 exec 怎么选
- 要 AI 自己跑个脚本、抓个日志、跑构建 → 用
exec,后台无头,干净。 - 要 AI 看/操作你正盯着的那个人工终端 → 用
terminal。 - 别让 AI 用
terminal去开新 shell 干自己的活,那是越界;那种活归exec。
踩坑提醒
- input 要授权:往你终端塞输入默认需你批准,无人值守场景(cron)里它不会自动过,别指望它能替你盲敲回车。
- read 是快照不是流:它读的是当前缓冲,不是 tail -f。要看实时变化,多读几次或配合 exec 的日志轮询。
- sessionId 会变:终端关了再开,
sessionId是新的。脚本里别硬编码旧 id,先list再操作。 - 缓冲区有上限:跑了几万行的终端,read 可能只返回尾部,需要的内容太早会被冲掉,关键输出记得
exec里tee到文件。
一个真实组合拳
我想确认一台远程机器上的 nginx 是不是真起来了,又不想自己切终端:
terminallist → 拿到我在控制面板开的那台机器终端t-xyz。terminalreadt-xyz→ 看到终端停在systemctl status nginx的输出,但被清屏了看不全。- 改用
exec:ssh host "systemctl is-active nginx && curl -sI localhost:80 | head -1"→ 干净拿到active和HTTP/1.1 200。 - 结论到手,让 AI
terminalcloset-xyz收尾。
这就是分工:terminal 接管人工现场,exec 跑干净的后台验证。
小结
terminal 是 OpenClaw 里专门接管线——把人类在控制面板的终端变成 AI 能读、能写、能收尾的延伸。记住三件事:list 先拿 id、input 显式带回车、关了就 close。剩下的活,交给 exec。
扫码关注公众号,获取更多 OpenClaw 实操技巧:
