# SSH access (/docs/sandbox/ssh-access)

<!-- agent-signals: reading_time_min: 2 · est_tokens: 1807 · updated: 2026-07-30 -->
Related: [Auto-resume on request](/docs/sandbox/auto-resume.md), [Connect to running sandbox](/docs/sandbox/connect.md), [Environment variables](/docs/sandbox/environment-variables.md), [Filesystem-only snapshots](/docs/sandbox/filesystem-only-snapshots.md), [Sandbox forking](/docs/sandbox/fork.md), [Git integration](/docs/sandbox/git-integration.md)

SSH access enables remote terminal sessions, SCP/SFTP file transfers, and integration with tools that expect SSH connectivity.

## Quickstart [#quickstart]

<Steps>
  <Step title="Build the SSH template">
    Define a template with OpenSSH server and [websocat](https://github.com/vi/websocat):

    <CodeGroup>
      <CodeBlockTabs defaultValue="JavaScript & TypeScript" groupId="javascript-typescript+python">
        <CodeBlockTabsList>
          <CodeBlockTabsTrigger value="JavaScript & TypeScript">
            JavaScript & TypeScript
          </CodeBlockTabsTrigger>

          <CodeBlockTabsTrigger value="Python">
            Python
          </CodeBlockTabsTrigger>
        </CodeBlockTabsList>

        <CodeBlockTab value="JavaScript & TypeScript">
          ```typescript  
          // template.ts
          import { Template, waitForPort } from 'e2b'

          export const template = Template()
            .fromUbuntuImage('25.04')
            .aptInstall(['openssh-server'])
            .runCmd([
              'curl -fsSL -o /usr/local/bin/websocat https://github.com/vi/websocat/releases/latest/download/websocat.x86_64-unknown-linux-musl',
              'chmod a+x /usr/local/bin/websocat',
            ], { user: 'root' })
            .setStartCmd('sudo websocat -b --exit-on-eof ws-l:0.0.0.0:8081 tcp:127.0.0.1:22', waitForPort(8081))
          ```
        </CodeBlockTab>

        <CodeBlockTab value="Python">
          ```python  
          # template.py
          from e2b import Template, wait_for_port

          template = (
              Template()
              .from_ubuntu_image("25.04")
              .apt_install(["openssh-server"])
              .run_cmd([
                  "curl -fsSL -o /usr/local/bin/websocat https://github.com/vi/websocat/releases/latest/download/websocat.x86_64-unknown-linux-musl",
                  "chmod a+x /usr/local/bin/websocat",
              ], user="root")
              .set_start_cmd("sudo websocat -b --exit-on-eof ws-l:0.0.0.0:8081 tcp:127.0.0.1:22", wait_for_port(8081))
          )
          ```
        </CodeBlockTab>
      </CodeBlockTabs>
    </CodeGroup>

    Build the template:

    <CodeGroup>
      <CodeBlockTabs defaultValue="JavaScript & TypeScript" groupId="javascript-typescript+python">
        <CodeBlockTabsList>
          <CodeBlockTabsTrigger value="JavaScript & TypeScript">
            JavaScript & TypeScript
          </CodeBlockTabsTrigger>

          <CodeBlockTabsTrigger value="Python">
            Python
          </CodeBlockTabsTrigger>
        </CodeBlockTabsList>

        <CodeBlockTab value="JavaScript & TypeScript">
          ```typescript  
          // build.ts
          import { Template, defaultBuildLogger } from 'e2b'
          import { template as sshTemplate } from './template'

          await Template.build(sshTemplate, 'ssh-ready', {
            cpuCount: 2,
            memoryMB: 2048,
            onBuildLogs: defaultBuildLogger(),
          })
          ```
        </CodeBlockTab>

        <CodeBlockTab value="Python">
          ```python  
          # build.py
          from e2b import Template, default_build_logger
          from template import template as ssh_template

          Template.build(ssh_template, "ssh-ready",
              cpu_count=2,
              memory_mb=2048,
              on_build_logs=default_build_logger(),
          )
          ```
        </CodeBlockTab>
      </CodeBlockTabs>
    </CodeGroup>
  </Step>

  <Step title="Create a sandbox from the template">
    <CodeGroup>
      <CodeBlockTabs defaultValue="JavaScript & TypeScript" groupId="javascript-typescript+python">
        <CodeBlockTabsList>
          <CodeBlockTabsTrigger value="JavaScript & TypeScript">
            JavaScript & TypeScript
          </CodeBlockTabsTrigger>

          <CodeBlockTabsTrigger value="Python">
            Python
          </CodeBlockTabsTrigger>
        </CodeBlockTabsList>

        <CodeBlockTab value="JavaScript & TypeScript">
          ```typescript  
          import { Sandbox } from 'e2b'

          const sbx = await Sandbox.create('ssh-ready')
          console.log(sbx.sandboxId)
          ```
        </CodeBlockTab>

        <CodeBlockTab value="Python">
          ```python  
          from e2b import Sandbox

          sbx = Sandbox.create("ssh-ready")
          print(sbx.sandbox_id)
          ```
        </CodeBlockTab>
      </CodeBlockTabs>
    </CodeGroup>
  </Step>

  <Step title="Connect from your machine">
    <CodeGroup>
      <CodeBlockTabs defaultValue="macOS" groupId="linux+macos">
        <CodeBlockTabsList>
          <CodeBlockTabsTrigger value="macOS">
            macOS
          </CodeBlockTabsTrigger>

          <CodeBlockTabsTrigger value="Linux">
            Linux
          </CodeBlockTabsTrigger>
        </CodeBlockTabsList>

        <CodeBlockTab value="macOS">
          ```bash  
          # Install websocat
          brew install websocat

          # Connect to your sandbox
          ssh -o 'ProxyCommand=websocat --binary -B 65536 - wss://8081-%h.e2b.app' user@<sandbox-id>
          ```
        </CodeBlockTab>

        <CodeBlockTab value="Linux">
          ```bash  
          # Install websocat
          sudo curl -fsSL -o /usr/local/bin/websocat https://github.com/vi/websocat/releases/latest/download/websocat.x86_64-unknown-linux-musl
          sudo chmod a+x /usr/local/bin/websocat

          # Connect to your sandbox
          ssh -o 'ProxyCommand=websocat --binary -B 65536 - wss://8081-%h.e2b.app' user@<sandbox-id>
          ```
        </CodeBlockTab>
      </CodeBlockTabs>
    </CodeGroup>
  </Step>
</Steps>

***

## How it works [#how-it-works]

This method uses [websocat](https://github.com/vi/websocat) to proxy SSH connections over WebSocket through the sandbox's exposed ports.

```
┌───────────────────────────────────────────────────────────┐
│  Your Machine                                             │
│  ┌──────────┐    ProxyCommand    ┌──────────────────┐     │
│  │   SSH    │ ────────────────── │    websocat      │     │
│  │  Client  │                    │   (WebSocket)    │     │
│  └──────────┘                    └─────────┬────────┘     │
└────────────────────────────────────────────┼──────────────┘
                                             │
                         wss://8081-<sandbox-id>.e2b.app
                                             │
┌────────────────────────────────────────────┼──────────────┐
│  E2B Sandbox                               ▼              │
│                                  ┌──────────────────┐     │
│                                  │    websocat      │     │
│                                  │  (WS → TCP:22)   │     │
│                                  └─────────┬────────┘     │
│                                            │              │
│                                  ┌─────────▼────────┐     │
│                                  │   SSH Server     │     │
│                                  │   (OpenSSH)      │     │
│                                  └──────────────────┘     │
└───────────────────────────────────────────────────────────┘
```
