INTEGRITY Документация

Выполнять команды

В этом руководстве показано, как эффективно выполнять команды в песочнице, обрабатывать вывод и управлять ошибками.

Выбор подходящего метода

SDK предлагает несколько способов запуска команд:

Выполнение базовых команд

Используйте exec() для простых команд, которые быстро завершаются:

import { getSandbox } from "@cloudflare/sandbox";

const sandbox = getSandbox(env.Sandbox, "my-sandbox");

// Execute a single command
const result = await sandbox.exec("python --version");

console.log(result.stdout); // "Python 3.11.0"
console.log(result.exitCode); // 0
console.log(result.success); // true
import { getSandbox } from '@cloudflare/sandbox';

const sandbox = getSandbox(env.Sandbox, 'my-sandbox');

// Execute a single command
const result = await sandbox.exec('python --version');

console.log(result.stdout);   // "Python 3.11.0"
console.log(result.exitCode); // 0
console.log(result.success);  // true

Безопасная передача аргументов

При передаче пользовательского ввода или динамических значений избегайте интерполяции строк, чтобы предотвратить атаки внедрения кода:

// Unsafe - vulnerable to injection
const filename = userInput;
await sandbox.exec(`cat ${filename}`);

// Safe - use proper escaping or validation
const safeFilename = filename.replace(/[^a-zA-Z0-9_.-]/g, "");
await sandbox.exec(`cat ${safeFilename}`);

// Better - write to file and execute
await sandbox.writeFile("/tmp/input.txt", userInput);
await sandbox.exec("python process.py /tmp/input.txt");
// Unsafe - vulnerable to injection
const filename = userInput;
await sandbox.exec(`cat ${filename}`);

// Safe - use proper escaping or validation
const safeFilename = filename.replace(/[^a-zA-Z0-9_.-]/g, '');
await sandbox.exec(`cat ${safeFilename}`);

// Better - write to file and execute
await sandbox.writeFile('/tmp/input.txt', userInput);
await sandbox.exec('python process.py /tmp/input.txt');

Обработка ошибок

Команды могут завершиться ошибкой двумя способами:

  1. Ненулевой код выхода - Команда выполнилась, но завершилась с ошибкой (result.success === false)
  2. Ошибка выполнения - Команда не смогла запуститься (выбрасывает исключение)
try {
	const result = await sandbox.exec("python analyze.py");

	if (!result.success) {
		// Command failed (non-zero exit code)
		console.error("Analysis failed:", result.stderr);
		console.log("Exit code:", result.exitCode);

		// Handle specific exit codes
		if (result.exitCode === 1) {
			throw new Error("Invalid input data");
		} else if (result.exitCode === 2) {
			throw new Error("Missing dependencies");
		}
	}

	// Success - process output
	return JSON.parse(result.stdout);
} catch (error) {
	// Execution error (couldn't start command)
	console.error("Execution failed:", error.message);
	throw error;
}
try {
  const result = await sandbox.exec('python analyze.py');

  if (!result.success) {
    // Command failed (non-zero exit code)
    console.error('Analysis failed:', result.stderr);
    console.log('Exit code:', result.exitCode);

    // Handle specific exit codes
    if (result.exitCode === 1) {
      throw new Error('Invalid input data');
    } else if (result.exitCode === 2) {
      throw new Error('Missing dependencies');
    }
  }

  // Success - process output
  return JSON.parse(result.stdout);

} catch (error) {
  // Execution error (couldn't start command)
  console.error('Execution failed:', error.message);
  throw error;
}

Выполнение команд оболочки

Песочница поддерживает функции оболочки, такие как конвейеры, перенаправления и цепочки команд:

// Pipes and filters
const result = await sandbox.exec('ls -la | grep ".py" | wc -l');
console.log("Python files:", result.stdout.trim());

// Output redirection
await sandbox.exec("python generate.py > output.txt 2> errors.txt");

// Multiple commands
await sandbox.exec("cd /workspace && npm install && npm test");
// Pipes and filters
const result = await sandbox.exec('ls -la | grep ".py" | wc -l');
console.log('Python files:', result.stdout.trim());

// Output redirection
await sandbox.exec('python generate.py > output.txt 2> errors.txt');

// Multiple commands
await sandbox.exec('cd /workspace && npm install && npm test');

Выполнение скриптов Python

// Run inline Python
const result = await sandbox.exec('python -c "print(sum([1, 2, 3, 4, 5]))"');
console.log("Sum:", result.stdout.trim()); // "15"

// Run a script file
await sandbox.writeFile(
	"/workspace/analyze.py",
	`
import sys
print(f"Argument: {sys.argv[1]}")
`,
);

await sandbox.exec("python /workspace/analyze.py data.csv");
// Run inline Python
const result = await sandbox.exec('python -c "print(sum([1, 2, 3, 4, 5]))"');
console.log('Sum:', result.stdout.trim()); // "15"

// Run a script file
await sandbox.writeFile('/workspace/analyze.py', `
import sys
print(f"Argument: {sys.argv[1]}")
`);

await sandbox.exec('python /workspace/analyze.py data.csv');

Тайм-ауты

Задайте максимальное время выполнения команд, чтобы длительные операции не блокировали работу бесконечно.

Таймаут для каждой команды

Передайте timeout в параметрах, чтобы задать тайм-аут для отдельной команды:

const result = await sandbox.exec("npm run build", {
	timeout: 30000, // 30 seconds
});
const result = await sandbox.exec('npm run build', {
  timeout: 30000 // 30 seconds
});

Тайм-аут на уровне сессии

Задайте тайм-аут по умолчанию для всех команд в сессии с помощью commandTimeoutMs:

const session = await sandbox.createSession({
	commandTimeoutMs: 10000, // 10s default for all commands
});

await session.exec("npm install"); // Times out after 10s
await session.exec("npm run build"); // Times out after 10s

// Per-command timeout overrides the session default
await session.exec("npm test", { timeout: 60000 }); // 60s for this command
const session = await sandbox.createSession({
  commandTimeoutMs: 10000 // 10s default for all commands
});

await session.exec('npm install');    // Times out after 10s
await session.exec('npm run build');  // Times out after 10s

// Per-command timeout overrides the session default
await session.exec('npm test', { timeout: 60000 }); // 60s for this command

Глобальный тайм-аут

Задайте COMMAND_TIMEOUT_MS переменная окружения чтобы задать глобальный таймаут по умолчанию для каждого exec() вызов во всех сессиях.

Приоритет тайм-аута

Если настроено несколько тайм-аутов, приоритет имеет наиболее конкретное значение:

  1. Для каждой команды timeout на exec() (наивысший приоритет)
  2. Уровень сессии commandTimeoutMs на createSession()
  3. Глобальный COMMAND_TIMEOUT_MS переменная окружения (низший приоритет)

Если ни один параметр не задан, команды выполняются без ограничения по времени.

Тайм-аут не завершает процесс

Рекомендации

Устранение неполадок

Команда не найдена

Проверьте, что команда существует в контейнере:

const check = await sandbox.exec("which python3");
if (!check.success) {
	console.error("python3 not found");
}
const check = await sandbox.exec('which python3');
if (!check.success) {
  console.error('python3 not found');
}

Проблемы с рабочим каталогом

Используйте абсолютные пути или смените директорию:

// Use absolute path
await sandbox.exec("python /workspace/my-app/script.py");

// Or change directory
await sandbox.exec("cd /workspace/my-app && python script.py");
// Use absolute path
await sandbox.exec('python /workspace/my-app/script.py');

// Or change directory
await sandbox.exec('cd /workspace/my-app && python script.py');