Как запустить Bash внутри TypeScript и не сжечь сервер
Представьте, что вы строите 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() изолирован в плане переменных окружения и текущей директории, но файловая система сохраняется между вызовами. Это удобно — можно постепенно наполнять среду данными.
Гибкая файловая система
Разработчики предусмотрели несколько сценариев работы с файлами. Это не просто «папка в памяти», а полноценная абстракция.
- InMemoryFs: По умолчанию. Все данные живут в JS-объектах. Идеально для быстрых тестов.
- OverlayFs: Пожалуй, самый полезный режим. Вы даете доступ к реальной папке на диске (например, с исходниками проекта), но все изменения, которые делает Bash, записываются только в память. Оригинальные файлы остаются нетронутыми.
- 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 на уровне ОС.