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

Обзор

Инструмент bash предоставляет Claude:
  • Постоянную сессию bash, которая сохраняет состояние
  • Возможность запускать любую команду оболочки
  • Доступ к переменным окружения и рабочему каталогу
  • Возможности цепочки команд и написания скриптов

Совместимость моделей

МодельВерсия инструмента
Claude 4 модели и Sonnet 3.7 (устарело)bash_20250124
Старые версии инструмента не гарантируют обратную совместимость с новыми моделями. Всегда используйте версию инструмента, которая соответствует версии вашей модели.

Варианты использования

  • Рабочие процессы разработки: Запуск команд сборки, тестов и инструментов разработки
  • Автоматизация системы: Выполнение скриптов, управление файлами, автоматизация задач
  • Обработка данных: Обработка файлов, запуск скриптов анализа, управление наборами данных
  • Настройка окружения: Установка пакетов, настройка окружения

Быстрый старт

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    tools=[
        {
            "type": "bash_20250124",
            "name": "bash"
        }
    ],
    messages=[
        {"role": "user", "content": "List all Python files in the current directory."}
    ]
)

Как это работает

Инструмент bash поддерживает постоянную сессию:
  1. Claude определяет, какую команду запустить
  2. Вы выполняете команду в оболочке bash
  3. Возвращаете вывод (stdout и stderr) в Claude
  4. Состояние сессии сохраняется между командами (переменные окружения, рабочий каталог)

Параметры

ПараметрОбязательныйОписание
commandДа*Команда bash для запуска
restartНетУстановите значение true для перезагрузки сессии bash
*Обязательный, если не используется restart
// Запуск команды
{
  "command": "ls -la *.py"
}

// Перезагрузка сессии
{
  "restart": true
}

Пример: Многошаговая автоматизация

Claude может объединять команды для выполнения сложных задач:
# Запрос пользователя
"Install the requests library and create a simple Python script that fetches a joke from an API, then run it."

# Claude использует инструмент:
# 1. Установка пакета
{"command": "pip install requests"}

# 2. Создание скрипта
{"command": "cat > fetch_joke.py << 'EOF'\nimport requests\nresponse = requests.get('https://official-joke-api.appspot.com/random_joke')\njoke = response.json()\nprint(f\"Setup: {joke['setup']}\")\nprint(f\"Punchline: {joke['punchline']}\")\nEOF"}

# 3. Запуск скрипта
{"command": "python fetch_joke.py"}
Сессия сохраняет состояние между командами, поэтому файлы, созданные на шаге 2, доступны на шаге 3.

Реализация инструмента bash

Инструмент bash реализован как инструмент без схемы. При использовании этого инструмента вам не нужно предоставлять входную схему, как с другими инструментами; схема встроена в модель Claude и не может быть изменена.
1

Настройка окружения bash

Создайте постоянную сессию bash, с которой Claude может взаимодействовать:
import subprocess
import threading
import queue

class BashSession:
    def __init__(self):
        self.process = subprocess.Popen(
            ['/bin/bash'],
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
            bufsize=0
        )
        self.output_queue = queue.Queue()
        self.error_queue = queue.Queue()
        self._start_readers()
2

Обработка выполнения команд

Создайте функцию для выполнения команд и захвата вывода:
def execute_command(self, command):
    # Отправка команды в bash
    self.process.stdin.write(command + '\n')
    self.process.stdin.flush()
    
    # Захват вывода с тайм-аутом
    output = self._read_output(timeout=10)
    return output
3

Обработка вызовов инструментов Claude

Извлеките и выполните команды из ответов Claude:
for content in response.content:
    if content.type == "tool_use" and content.name == "bash":
        if content.input.get("restart"):
            bash_session.restart()
            result = "Bash session restarted"
        else:
            command = content.input.get("command")
            result = bash_session.execute_command(command)
        
        # Возврат результата в Claude
        tool_result = {
            "type": "tool_result",
            "tool_use_id": content.id,
            "content": result
        }
4

Реализация мер безопасности

Добавьте валидацию и ограничения:
def validate_command(command):
    # Блокировка опасных команд
    dangerous_patterns = ['rm -rf /', 'format', ':(){:|:&};:']
    for pattern in dangerous_patterns:
        if pattern in command:
            return False, f"Command contains dangerous pattern: {pattern}"
    
    # Добавьте дополнительную валидацию по мере необходимости
    return True, None

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

При реализации инструмента bash обрабатывайте различные сценарии ошибок:
Если команда выполняется слишком долго:
{
  "role": "user",
  "content": [
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01A09q90qw90lq917835lq9",
      "content": "Error: Command timed out after 30 seconds",
      "is_error": true
    }
  ]
}
Если команда не существует:
{
  "role": "user",
  "content": [
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01A09q90qw90lq917835lq9",
      "content": "bash: nonexistentcommand: command not found",
      "is_error": true
    }
  ]
}
Если есть проблемы с разрешениями:
{
  "role": "user",
  "content": [
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01A09q90qw90lq917835lq9",
      "content": "bash: /root/sensitive-file: Permission denied",
      "is_error": true
    }
  ]
}

Следуйте лучшим практикам реализации

Реализуйте тайм-ауты для предотвращения зависания команд:
def execute_with_timeout(command, timeout=30):
    try:
        result = subprocess.run(
            command, 
            shell=True, 
            capture_output=True, 
            text=True, 
            timeout=timeout
        )
        return result.stdout + result.stderr
    except subprocess.TimeoutExpired:
        return f"Command timed out after {timeout} seconds"
Сохраняйте сессию bash постоянной для сохранения переменных окружения и рабочего каталога:
# Команды, выполняемые в одной сессии, сохраняют состояние
commands = [
    "cd /tmp",
    "echo 'Hello' > test.txt",
    "cat test.txt"  # Это работает, потому что мы все еще в /tmp
]
Усеките очень большие выводы, чтобы предотвратить проблемы с лимитом токенов:
def truncate_output(output, max_lines=100):
    lines = output.split('\n')
    if len(lines) > max_lines:
        truncated = '\n'.join(lines[:max_lines])
        return f"{truncated}\n\n... Output truncated ({len(lines)} total lines) ..."
    return output
Ведите журнал аудита выполненных команд:
import logging

def log_command(command, output, user_id):
    logging.info(f"User {user_id} executed: {command}")
    logging.info(f"Output: {output[:200]}...")  # Логирование первых 200 символов
Удалите конфиденциальную информацию из выводов команд:
def sanitize_output(output):
    # Удаление потенциальных секретов или учетных данных
    import re
    # Пример: удаление учетных данных AWS
    output = re.sub(r'aws_access_key_id\s*=\s*\S+', 'aws_access_key_id=***', output)
    output = re.sub(r'aws_secret_access_key\s*=\s*\S+', 'aws_secret_access_key=***', output)
    return output

Безопасность

Инструмент bash предоставляет прямой доступ к системе. Реализуйте эти необходимые меры безопасности:
  • Запуск в изолированных окружениях (Docker/VM)
  • Реализация фильтрации команд и списков разрешений
  • Установка лимитов ресурсов (CPU, память, диск)
  • Логирование всех выполненных команд

Ключевые рекомендации

  • Используйте ulimit для установки ограничений ресурсов
  • Фильтруйте опасные команды (sudo, rm -rf и т.д.)
  • Запускайте с минимальными разрешениями пользователя
  • Мониторьте и логируйте все выполнения команд

Цены

The bash tool adds 245 input tokens to your API calls. Additional tokens are consumed by:
  • Command outputs (stdout/stderr)
  • Error messages
  • Large file contents
Полные сведения о ценах см. в разделе цены на использование инструментов.

Распространенные шаблоны

Рабочие процессы разработки

  • Запуск тестов: pytest && coverage report
  • Сборка проектов: npm install && npm run build
  • Операции Git: git status && git add . && git commit -m "message"

Операции с файлами

  • Обработка данных: wc -l *.csv && ls -lh *.csv
  • Поиск в файлах: find . -name "*.py" | xargs grep "pattern"
  • Создание резервных копий: tar -czf backup.tar.gz ./data

Системные задачи

  • Проверка ресурсов: df -h && free -m
  • Управление процессами: ps aux | grep python
  • Настройка окружения: export PATH=$PATH:/new/path && echo $PATH

Ограничения

  • Нет интерактивных команд: Не может обрабатывать vim, less или запросы пароля
  • Нет приложений GUI: Только командная строка
  • Область сессии: Сохраняется в рамках разговора, теряется между вызовами API
  • Лимиты вывода: Большие выводы могут быть усечены
  • Нет потоковой передачи: Результаты возвращаются после завершения

Комбинирование с другими инструментами

Инструмент bash наиболее мощен при комбинировании с текстовым редактором и другими инструментами.

Следующие шаги