Как запустить Bash внутри TypeScript и не сжечь сервер

05 May, 2026

Представьте, что вы строите AI-агента. Вы хотите, чтобы он мог не просто рассуждать, но и действовать: проверять файлы, обрабатывать JSON через jq или даже скачивать данные. Давать нейронке прямой доступ к вашему терминалу — идея так себе. Раньше приходилось либо возиться с Docker-контейнерами, либо поднимать тяжелые виртуальные машины. Ребята из Vercel решили эту проблему элегантно, выпустив just-bash.

Это полноценная симуляция Bash-окружения, написанная на TypeScript. Она работает в памяти, имеет виртуальную файловую систему и при этом ведет себя как настоящий терминал.

Что это на самом деле

just-bash — это не просто парсер команд. Это песочница. Когда вы вызываете ls или grep, код выполняется внутри изолированной среды. Весь процесс происходит в оперативной памяти вашего Node.js приложения (или даже в браузере). Если агент решит выполнить rm -rf /, он просто очистит виртуальный объект в памяти, а ваша рабочая машина останется целой.

Проект сейчас в бете, но за ним стоит Vercel Labs, так что архитектура там серьезная. Главная ценность здесь в безопасности: по умолчанию у оболочки нет доступа к сети и реальным файлам.

Как это работает на практике

Установка стандартная: npm install just-bash. После этого вы получаете объект, с которым можно общаться как с обычным терминалом.

import { Bash } from "just-bash";

const env = new Bash();
// Создаем файл и сразу читаем его
await env.exec('echo "Привет, хабр" > note.txt');
const result = await env.exec("cat note.txt");

console.log(result.stdout); // "Привет, хабр\n"

Интересный момент: каждый вызов exec() изолирован в плане переменных окружения и текущей директории, но файловая система сохраняется между вызовами. Это удобно — можно постепенно наполнять среду данными.

Гибкая файловая система

Разработчики предусмотрели несколько сценариев работы с файлами. Это не просто «папка в памяти», а полноценная абстракция.

  1. InMemoryFs: По умолчанию. Все данные живут в JS-объектах. Идеально для быстрых тестов.
  2. OverlayFs: Пожалуй, самый полезный режим. Вы даете доступ к реальной папке на диске (например, с исходниками проекта), но все изменения, которые делает Bash, записываются только в память. Оригинальные файлы остаются нетронутыми.
  3. MountableFs: Позволяет собирать файловую систему как конструктор. Можно примонтировать базу знаний в режиме "только чтение" в /mnt/docs, а рабочую область — в /home/user.

Есть еще крутая фишка с «ленивыми» файлами. Вы можете создать файл, содержимое которого сгенерируется только в момент обращения к нему. Например, если нужно подтянуть тяжелый конфиг из внешнего API.

Кастомные команды на TypeScript

Если стандартных ls и grep не хватает, можно написать свои команды прямо на TS. Это открывает простор для интеграций. Можно сделать команду deploy или notify, которая будет дергать ваш внутренний бэкенд, но для AI-агента это будет выглядеть как обычная утилита в терминале.

import { defineCommand } from "just-bash";

const myCommand = defineCommand("hello", async (args) => {
  return { stdout: `Привет, ${args[0]}!`, stderr: "", exitCode: 0 };
});

Безопасность и ограничения

Vercel сразу предупреждает: Bash — штука сложная, и защититься от всех видов DOS-атак через ввод данных внутри JS невозможно. Но от базовых проблем они подстраховались:

  • Защита от бесконечных циклов: можно выставить лимиты на количество команд или глубину рекурсии.
  • Сетевой фильтр: curl по умолчанию выключен. Если его включить, можно жестко ограничить список разрешенных доменов и методов (например, разрешить только GET на api.github.com).
  • Никаких бинарников: запустить скомпилированный C++ файл или даже WASM внутри этой среды не получится. Если нужно именно это, придется смотреть в сторону полноценных VM.

Зачем это нужно разработчику

Главный кейс — это, конечно, LLM. Когда вы скармливаете агенту контекст, ему часто нужно «пощупать» код: запустить тесты или найти вхождения строки. just-bash дает ему этот инструмент без риска для хост-системы.

Вторая область — интерактивные обучающие платформы. Если вы делаете туториал по командной строке, вам больше не нужно арендовать серверы для каждого ученика. Всю песочницу можно запустить прямо в браузере клиента.

Кстати, в репозитории есть поддержка Python (через Pyodide) и SQLite. Это превращает простую оболочку в полноценную среду для анализа данных, которая разворачивается за миллисекунды.

Стоит ли тащить это в продакшн? Если вы работаете над AI-инструментами — определенно да. Это гораздо легче и дешевле, чем управлять парком микро-контейнеров.

Проект подкупает своей простотой: это просто библиотека, а не инфраструктурный монстр. Если вам нужно быстро дать скрипту безопасный уголок для работы с файлами, just-bash — отличный кандидат. Но помните, что это бета, и для критически важных задач стоит дополнительно изолировать сам процесс Node.js на уровне ОС.