This feature is eligible for Zero Data Retention (ZDR). When your organization has a ZDR arrangement, data sent through this feature is not stored after the API response is returned.
Bash 工具使 Claude 能够在持久化的 bash 会话中执行 shell 命令,允许系统操作、脚本执行和命令行自动化。Shell 访问是一项基础的代理能力。在 Terminal-Bench 2.0(一个使用仅 shell 验证来评估真实世界终端任务的基准)上,Claude 在访问持久化 bash 会话时展示了强劲的性能提升。
Bash 工具为 Claude 提供:
有关模型支持,请参阅 工具参考。
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
tools=[{"type": "bash_20250124", "name": "bash"}],
messages=[
{"role": "user", "content": "List all Python files in the current directory."}
],
)
print(response)Bash 工具维持一个持久化会话:
| 参数 | 必需 | 描述 |
|---|---|---|
command | 是* | 要运行的 bash 命令 |
restart | 否 | 设置为 true 以重启 bash 会话 |
*除非使用 restart,否则为必需
Claude 可以链接命令来完成复杂任务:
用户请求:
"安装 requests 库并创建一个简单的 Python 脚本,
从 API 获取一个笑话,然后运行它。"
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 工具实现为无模式工具。使用此工具时,你不需要像其他工具那样提供输入模式;模式内置在 Claude 的模型中,无法修改。
设置 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()处理命令执行
创建一个函数来执行命令并捕获输出:
def execute_command(self, command):
# Send command to bash
self.process.stdin.write(command + "\n")
self.process.stdin.flush()
# Capture output with timeout
output = self._read_output(timeout=10)
return output
处理 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)
# Return result to Claude
tool_result = {
"type": "tool_result",
"tool_use_id": content.id,
"content": result,
}实现安全措施
添加验证和限制。使用允许列表而不是阻止列表,因为阻止列表容易被绕过。拒绝 shell 操作符,以便链接的命令无法绕过允许列表:
import shlex
ALLOWED_COMMANDS = {"ls", "cat", "echo", "pwd", "grep", "find", "wc", "head", "tail"}
SHELL_OPERATORS = {"&&", "||", "|", ";", "&", ">", "<", ">>"}
def validate_command(command):
# Allow only commands from an explicit allowlist
try:
tokens = shlex.split(command)
except ValueError:
return False, "Could not parse command"
if not tokens:
return False, "Empty command"
executable = tokens[0]
if executable not in ALLOWED_COMMANDS:
return False, f"Command '{executable}' is not in the allowlist"
# Reject shell operators that would chain additional commands
for token in tokens[1:]:
if token in SHELL_OPERATORS or token.startswith(("$", "`")):
return False, f"Shell operator '{token}' is not allowed"
return True, None此检查是第一道防线。为了更强的隔离,使用 shell=False 运行验证的命令,并将 shlex.split(command) 作为参数列表传递,这样 shell 永远不会解释该字符串。
实现 bash 工具时,处理各种错误场景:
Bash 工具提供直接的系统访问。实现这些必要的安全措施:
ulimit 设置资源约束sudo、rm -rf 等)The bash tool adds 245 input tokens to your API calls.
Additional tokens are consumed by:
有关完整的定价详情,请参阅 工具使用定价。
pytest && coverage reportnpm install && npm run buildgit status && git add . && git commit -m "message"Git 在长期运行的代理工作流中充当结构化恢复机制,而不仅仅是保存更改的方式:
git log 和进度文件,以了解已经完成的工作和接下来的工作。git checkout 会恢复到最后一个良好的提交,而不是尝试调试损坏的状态。wc -l *.csv && ls -lh *.csvfind . -name "*.py" | xargs grep "pattern"tar -czf backup.tar.gz ./datadf -h && free -mps aux | grep pythonexport PATH=$PATH:/new/path && echo $PATHvim、less 或密码提示Bash 工具与 文本编辑器 和其他工具结合时最强大。
如果你也在使用 代码执行工具,Claude 可以访问两个独立的执行环境:你的本地 bash 会话和 Anthropic 的沙箱容器。状态在它们之间不共享。有关如何提示 Claude 区分环境的指导,请参阅 将代码执行与其他执行工具结合使用。
Was this page helpful?