BastionShell SSH(VS Code 扩展)
站在 VS Code 的肩膀上的堡垒机终端:一次 MFA 认证 + 连接复用,之后多开会话、批量部署、文件上传都免二次认证。
核心能力
- 连接复用:一条堡垒机连接认证一次(密码 + MFA),后续开 N 个 shell 会话直接复用,不再输 MFA。
- MFA 在终端内输入:请求 MFA 时在终端里直接敲动态码(带倒计时),不弹窗。
- rz/sz 文件传输:ZMODEM(zmodem.js)上传/下载,适配 lrzsz。
- 部署任务:文件式任务(JSON),批量连接目标机器 → 前置命令 → 上传 → 脚本。
- 快捷命令、端口转发、批量连接。
- 个人习惯:把「你在这台机器上怎么干活」记成文件(提权方式 / 常用目录 / 口头习惯),AI 读一次就不再重复问你。
- 选中内容一键发给 AI:终端里选中文字后按键直接送进 AI 聊天,和编辑器里选代码发给 AI 一个手感。
- AI 桥接:
bastion.exec 命令让运行在 VS Code 里的 AI 插件能在服务器上执行命令(详见下文)。
侧边栏视图
左侧活动栏点终端图标,容器里有四个分区:
| 视图 |
说明 |
| 连接档案 |
新建/连接/删除堡垒机档案(点击档案直接连) |
| 部署任务 |
文件式任务;单击打开 JSON 编辑,右键运行/删除,顶部有 新建/批量执行/导出 |
| 快捷命令 |
点击把命令发送到当前会话 |
| 端口转发 |
本地端口 → 远端服务的 SSH 隧道 |
命令 ID(供 AI 插件 / 键盘绑定使用)
| 命令 ID |
作用 |
bastion.connect |
选档案并连接 |
bastion.addProfile |
新建连接档案 |
bastion.batchConnect |
批量连接(选档案 + 主机列表) |
bastion.exec |
AI 桥接:在活动会话执行远程命令并回传输出 |
bastion.uploadToSession |
上传文件到当前会话 |
bastion.addDeployTask / runDeployTask / batchRunDeployTasks |
部署任务 新建/运行/批量执行 |
bastion.addQuickCommand / sendQuickCommand |
快捷命令 |
bastion.addForwardRule / startForward |
端口转发 |
bastion.sendSelectionToAI |
把终端选中内容发给 AI(默认 Ctrl+Alt+I) |
bastion.sendTailToAI |
把终端最近输出发给 AI(默认 Ctrl+Alt+Shift+I) |
bastion.openHabitsFile |
打开个人习惯配置文件 |
把终端内容发给 AI
在堡垒机终端里选中一段报错或日志,按 Ctrl+Alt+I 就送进 AI 聊天;没选中东西时按 Ctrl+Alt+Shift+I 发最近若干行输出。
- 这两个键只在焦点位于终端时生效,不影响编辑器里的 AI 快捷键。
- 默认只把内容填进聊天输入框(你可以再补一句「这是什么问题」再回车);想直接发出去就把
bastion.sendToAiMode 改成 send。
- 没装 / 没登录 AI 聊天时自动降级:内容复制到剪贴板,并弹提示。
- 顺带一提:VS Code 自带「添加终端选中内容到聊天」(终端右键菜单),本扩展的命令是在它基础上补了一键快捷键和降级兜底。
个人习惯(habits.jsonc)
以前 AI 提权只能按写死的剧本走「先问要不要 sudo -i」,于是每台机器、每次会话都重复问同一件事;而 sudo -i 会换成交互式 shell,反而让「命令执行完」的判定失效。
现在把实际做法记进 ~/.bastionshell/habits.jsonc(顶部有完整中文说明,可手改):
{
"privilege": "ask", // 全局默认:none | sudo | sudo-i | ask
"notes": ["改配置前先备份到 /tmp/bak"],
"profiles": {
"生产": {
"privilege": "sudo", // 账号免密 → 直接 sudo <命令>,不进 sudo -i
"notes": ["jcssuser 的 sudo 免密"]
}
}
}
- AI 连接后先读它,按记录执行;只有
ask 或没记录时才问你一次,问完立刻记下来。
bastion_habits 工具可以读写它(read / remember / setPrivilege),写入只改目标字段,手写的中文注释不会被冲掉。
- 记成
privilege: "sudo" 还有个额外好处:sudo <命令> 也能用哨兵标记判定结束,不再依赖「输出静止 3 秒」的兜底猜测。
终端命名
每个会话的终端名为 用户名@主机(部署/批量连接的会话为 用户名@目标IP)。AI 或用户可据此识别会话。
AI 桥接(让 Copilot / Cursor / CodeBuddy 操作服务器)
堡垒机的 MFA 无法自动输入,是 AI 与服务器交互的最大障碍。本扩展用「一次认证 + 连接复用」解决它。
本扩展向 Copilot(agent 模式)等 AI 注册了五个语言模型工具:
| 工具 |
作用 |
bastion_connect |
通过堡垒机菜单连接到目标机器(参数:profile 档案名 + host 目标 IP + userChoice 选用户,默认 1) |
bastion_exec |
在会话上执行 shell 命令并返回输出(参数:command,可选 terminal 指定会话) |
bastion_listSessions |
列出当前所有会话的终端名 |
bastion_listProfiles |
列出连接档案及其提权习惯 |
bastion_habits |
读写个人习惯(action:read / remember / setPrivilege) |
生产堡垒机完整流程(AI 自动走,不用口头约定):
- 先手动连一次堡垒机(输密码 + MFA),连接保持复用。
- AI 调
bastion_connect({profile, host, userChoice}) → 自动经过菜单(输 IP 选主机 → 选用户)落到目标机,返回里带上该机器的提权习惯。
- AI 调
bastion_exec({command}) 执行命令,命令与输出实时显示在终端(人全程看得见)。提权方式按习惯走,不再每次问 sudo -i。
- 多会话时用
bastion_listSessions 看名字,bastion_exec 的 terminal 参数指定目标。
命令也会写到 <工作区>/.vscode/bastion-command.txt / bastion-last-output.txt(文件桥兜底,供不支持 LM 工具的 AI 用)。完成判定优先用哨兵标记(命令结束时打印一行唯一标记),标记不适用于交互式命令时退回「输出静止 3 秒」。
会话终端名默认是 用户@主机(或 用户@目标IP)。VS Code 不允许扩展改终端名,但你可以手动右键终端标签「重命名」,重命名后 bastion_exec 的 terminal 参数能按名字匹配。
配置
bastion.terminalLocation:新会话位置,editor(编辑器区,默认)或 panel(底部面板)。
bastion.sendToAiMode:发给 AI 的行为,insert(填进聊天输入框,默认)或 send(直接发出)。
bastion.tailLines:「发送最近输出」带多少行,默认 80。
配置文件都在 ~/.bastionshell/,每份顶部都有中文说明,直接改文件即生效:
| 文件 |
内容 |
profiles.jsonc |
连接档案(密码不在这里,存在系统加密存储里,连接时输入) |
habits.jsonc |
个人习惯(提权方式 / 常用目录 / 口头习惯) |
forwardRules.jsonc |
端口转发规则 |
quickCommands.jsonc |
快捷命令 |
部署任务 JSON 模板
{
"name": "部署 dcgm 配置",
"profile": "国内",
"hosts": ["10.0.0.1", "10.0.0.2"],
"uploads": ["D:/work/dcgm.yaml"],
"preCommand": "sudo -i\ncd /etc",
"script": "systemctl restart xxx",
"userChoice": "1"
}
任务文件存在扩展专用目录,不混进项目文件;「导出」按钮即复制到目标文件夹。