---
title: "暴露 SSH"
description: "如何打开安全的 SSH 访问沙箱,用于交互式调试、编辑器会话或长时间运行的进程。"
---
沙箱可以提供 SSH 凭据,方便你检查文件系统、查看日志、运行编辑器或转发端口,同时 microVM 保持在 Deploy 边缘隔离状态。
```tsx
import { Sandbox } from "@deno/sandbox";
await using sandbox = await Sandbox.create();
const { hostname, username } = await sandbox.exposeSsh();
console.log(`ssh ${username}@${hostname}`);
// 保持进程存活,或通过 SSH 交互直到完成...
await new Promise((resolve) => setTimeout(resolve, 10 * 60 * 1000));
```
```py
import time
from deno_sandbox import DenoDeploy
sdk = DenoDeploy()
with sdk.sandbox.create() as sandbox:
ssh = sandbox.expose_ssh()
print(f"ssh {ssh['username']}@{ssh['hostname']}")
# 保持进程存活,或通过 SSH 交互直到完成...
time.sleep(10 * 60)
```
```py
import asyncio
from deno_sandbox import AsyncDenoDeploy
sdk = AsyncDenoDeploy()
async with sdk.sandbox.create() as sandbox:
ssh = await sandbox.expose_ssh()
print(f"ssh {ssh['username']}@{ssh['hostname']}")
# 保持进程存活,或通过 SSH 交互直到完成...
await asyncio.sleep(10 * 60)
```
沙箱在配置的生命周期内保持可访问。一旦你的脚本释放引用(例如 `await using` 块结束),沙箱即关闭,SSH 端点消失;如果需要立即终止,也可以调用 `sandbox.kill()`。
## 何时使用 SSH 访问
- 调试只在沙箱中失败的代理生成代码
- 使用全屏终端编辑器或远程 VS Code 编辑文件
- 无需修改应用代码即可实时流式查看日志
- 手动运行更方便的分析或检查工具
由于每个沙箱已实现隔离,开启 SSH 并不会危及其他项目或组织。
## 从你的机器连接
1. 通过 `sandbox.exposeSsh()` 请求凭据。
2. 将返回的 `privateKey`(或 `identityFile`)保存到带有 `chmod 600` 权限的临时文件。
3. 使用提供的用户名和主机名连接:
```bash
ssh -i ./sandbox-key ${username}@${hostname}
```
4. 进行常规终端操作:复制文件、运行 top、查看日志或连接运行中的进程。
:::tip
提示:结合使用 SSH 和 [端口转发](https://man.openbsd.org/ssh#LOCAL_FORWARDING) 可以访问绑定在沙箱内 `localhost` 上的开发服务器。
:::
## 安全注意事项
- 凭据一次性使用并绑定沙箱的生命周期。
- 你可控制沙箱运行时长;销毁沙箱可以立即撤销访问权限。
## 保持沙箱存活
如果沙箱关闭,SSH 通道将断开。可通过以下方式保持沙箱运行:
- 设置 `lifetime: "session"`(默认)并保持管理脚本活跃
- 创建沙箱时传入 `lifetime: "5m"`(或其他时长),使其在脚本退出后持续运行,之后通过 `Sandbox.connect({ id })` 重新连接
当代码不再引用沙箱时,会自动清理,但你也可以执行 `sandbox.kill()`(或者在 SSH 会话内直接 `exit`)随时结束。
## 示例工作流程
```tsx
import { Sandbox } from "@deno/sandbox";
await using sandbox = await Sandbox.create({ timeout: "10m" });
// 准备应用
await sandbox.upload("./app", ".");
await sandbox.sh`deno task dev`
.noThrow(); // 启动服务器;保持运行以便检查
// 获取 SSH 详情并写入密钥文件
const ssh = await sandbox.exposeSsh();
await writeTextFile("./sandbox-key", ssh.privateKey);
await sandbox.sh`chmod 600 sandbox-key`;
console.log(`使用以下命令连接: ssh -i sandbox-key ${ssh.username}@${ssh.hostname}`);
// 阻塞直到手动调试完成
await new Promise((resolve) => setTimeout(resolve, 10 * 60 * 1000));
```
```py
import time
from deno_sandbox import DenoDeploy
sdk = DenoDeploy()
with sdk.sandbox.create(timeout="10m") as sandbox:
# 准备应用
sandbox.fs.upload("./app", ".")
proc = sandbox.spawn("deno", args=["task", "dev"])
# 启动服务器;保持运行以便检查
# 获取 SSH 详情
ssh = sandbox.expose_ssh()
print(f"连接命令: ssh {ssh['username']}@{ssh['hostname']}")
# 阻塞直到手动调试完成
time.sleep(10 * 60)
```
```py
import asyncio
from deno_sandbox import AsyncDenoDeploy
sdk = AsyncDenoDeploy()
async with sdk.sandbox.create(timeout="10m") as sandbox:
# 准备应用
await sandbox.fs.upload("./app", ".")
proc = await sandbox.spawn("deno", args=["task", "dev"])
# 启动服务器;保持运行以便检查
# 获取 SSH 详情
ssh = await sandbox.expose_ssh()
print(f"连接命令: ssh {ssh['username']}@{ssh['hostname']}")
# 阻塞直到手动调试完成
await asyncio.sleep(10 * 60)
```
使用此模式可调查不稳定的构建,运行交互式 REPL,或与团队成员配对,而无需将代码部署为完整的 Deploy 应用。