ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【Claude Code解惑】Shell 脚本增强:利用 Claude Code 编写复杂的自动化运维脚本

【Claude Code解惑】Shell 脚本增强:利用 Claude Code 编写复杂的自动化运维脚本 1. 从一次凌晨三点的批量巡检说起Shell 脚本在自动化运维里一直是那种“平时不起眼、出事全靠它”的角色。批量主机巡检、日志清理、服务重启、磁盘水位检查这些任务单看都不复杂但一旦要覆盖几十上百台机器还要处理超时、重试、并发、日志归档、失败告警脚本就会迅速膨胀成几百行难以维护的“祖传代码”。我见过太多团队里躺着一个check_all.sh没人敢改因为改错一行可能把生产环境的日志全删了。Claude Code 这类代码生成能力强的模型恰好能补上这个缺口你用自然语言把运维需求描述清楚它帮你产出结构完整、带错误处理和日志记录的 Shell 脚本骨架你只需要审查关键逻辑、调整路径和阈值就能落地。它适合谁适合每天要写巡检脚本、清理脚本、重启脚本的运维工程师和 SRE也适合刚接触 Linux 自动化、想快速上手复杂脚本编写的新手。这篇内容会给你可复制的提示词模板、脚本骨架、settings.json 配置片段以及本地执行和结果校验的具体动作让你从“会写简单脚本”过渡到“能驾驭复杂自动化运维脚本”。2. TaoToken 前置把模型调用接进你的脚本工作流2.1 为什么需要 TaoTokenClaude Code 本身是一个代码生成工具但如果你想把“生成脚本”这件事做成可重复、可集成的流程就需要一个稳定的模型调用入口。TaoToken 提供统一的 API 接入层你可以在本地脚本、CI 流水线、甚至运维平台里调用它把“自然语言需求 → Shell 脚本”这一步自动化。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。2.2 获取 API Key 与配置进入控制台创建 API Key地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。拿到 Key 之后不要硬编码在脚本里建议写入环境变量或配置文件。下面是一个settings.json配置片段用于在本地工具链中引用{ taotoken: { api_base: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, default_model: claude-sonnet, timeout_seconds: 60, max_retries: 3 }, script_gen: { output_dir: ./generated_scripts, shellcheck_enabled: true, sandbox_enabled: true } }对应的环境变量设置export TAOTOKEN_API_KEY你的APIKey如果你更习惯用命令行工具管理 Key可以访问 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 查看 Key 的创建和管理方式。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有完整的请求格式和参数说明。2.3 模型选择建议对于 Shell 脚本生成建议选择代码能力强的模型。如果你需要长期做编码和 Agent 类任务可以了解 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。如果只是想快速验证模型输出效果可以直接用模型对话入口 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 试几条提示词。3. 可复制配置提示词模板与脚本骨架3.1 批量主机巡检提示词模板下面这个模板可以直接复制使用把{{ }}里的内容替换成你的实际需求你是一个资深 Linux 运维专家擅长编写安全、健壮、可读性强的 Bash 脚本。 请编写一个名为 batch_inspect.sh 的 Bash 脚本实现以下功能 1. 从 hosts.txt 文件读取主机列表每行一个 IP 或主机名。 2. 对每台主机并发执行以下检查 - CPU 使用率取 1 分钟负载 - 内存使用率 - 根分区磁盘使用率 - 指定服务如 nginx的运行状态 3. 并发数通过 -p 参数控制默认 5。 4. 每台主机的检查结果输出为一行 JSON包含 host、cpu、mem、disk、service_status、timestamp。 5. 所有结果汇总写入 inspect_result.jsonl。 6. 对失败的主机记录错误信息到 inspect_error.log。 约束与要求 - 必须包含 set -euo pipefail。 - 所有变量引用必须加双引号。 - 使用 timeout 命令限制单台主机检查时间默认 10 秒。 - 提供 -h/--help 帮助信息。 - 脚本开头检查 hosts.txt 是否存在不存在则报错退出。 - 使用 ssh 执行远程命令时必须设置 ConnectTimeout 和 BatchMode。 - 禁止使用 rm -rf、dd 等危险命令。 - 添加清晰注释复杂逻辑处必须说明。 请直接输出完整脚本代码。3.2 日志清理脚本骨架日志清理是另一个高频场景核心难点在于“按时间保留、按大小截断、清理前确认、清理后记录”。下面是一个由 Claude Code 生成后我调整过的骨架#!/bin/bash set -euo pipefail LOG_DIR${LOG_DIR:-/var/log/app} RETAIN_DAYS${RETAIN_DAYS:-7} MAX_SIZE_MB${MAX_SIZE_MB:-500} DRY_RUN${DRY_RUN:-true} usage() { cat EOF Usage: $(basename $0) [options] -d LOG_DIR 日志目录默认 /var/log/app -r RETAIN_DAYS 保留天数默认 7 -s MAX_SIZE_MB 单文件大小上限(MB)默认 500 -f 实际执行删除默认 dry-run -h 显示帮助 EOF } while getopts d:r:s:fh opt; do case $opt in d) LOG_DIR$OPTARG ;; r) RETAIN_DAYS$OPTARG ;; s) MAX_SIZE_MB$OPTARG ;; f) DRY_RUNfalse ;; h) usage; exit 0 ;; *) usage; exit 1 ;; esac done if [[ ! -d $LOG_DIR ]]; then echo Error: log dir $LOG_DIR not found 2 exit 1 fi echo [$(date %F %T)] start cleanup dir$LOG_DIR retain$RETAIN_DAYS dry_run$DRY_RUN find $LOG_DIR -type f -name *.log -mtime $RETAIN_DAYS -print0 | while IFS read -r -d file; do if [[ $DRY_RUN true ]]; then echo [dry-run] would remove: $file else rm -f -- $file echo [removed] $file fi done echo [$(date %F %T)] cleanup done这个骨架的关键点set -euo pipefail保证出错即停DRY_RUN默认开启避免误删find -print0配合read -d 处理带空格的文件名所有变量加引号。3.3 服务重启脚本的并发控制服务重启脚本最容易出问题的地方是“并发重启导致依赖服务互相等待”。下面是一个带并发控制和重试的片段restart_service() { local host$1 local service$2 local retries3 local delay2 for i in $(seq 1 $retries); do if ssh -o ConnectTimeout5 -o BatchModeyes $host \ sudo systemctl restart $service sudo systemctl is-active $service; then echo {\host\:\$host\,\service\:\$service\,\status\:\ok\,\attempt\:$i} return 0 fi echo retry $i for $host/$service failed 2 sleep $delay delay$((delay * 2)) done echo {\host\:\$host\,\service\:\$service\,\status\:\failed\} return 1 } export -f restart_service cat hosts.txt | xargs -I{} -P ${CONCURRENCY:-5} bash -c restart_service $1 nginx _ {}这里用xargs -P控制并发用指数退避做重试每台主机的执行结果输出为 JSON 行方便后续用jq汇总。4. 验证请求与成功结果4.1 本地执行巡检脚本把生成的batch_inspect.sh保存到本地准备一个hosts.txt192.168.1.10 192.168.1.11 192.168.1.12赋予执行权限并运行chmod x batch_inspect.sh ./batch_inspect.sh -p 3预期输出类似{host:192.168.1.10,cpu:0.32,mem:61.2,disk:47,service_status:active,timestamp:2025-01-15T10:00:01} {host:192.168.1.11,cpu:0.18,mem:55.8,disk:39,service_status:active,timestamp:2025-01-15T10:00:02} {host:192.168.1.12,cpu:0.91,mem:78.4,disk:82,service_status:inactive,timestamp:2025-01-15T10:00:03}用jq快速校验jq -s map(select(.service_status ! active)) inspect_result.jsonl如果输出为空数组说明所有服务正常如果有内容就是需要关注的异常主机。4.2 日志清理脚本的 dry-run 验证先不实际删除跑一次 dry-run./log_cleanup.sh -d /var/log/app -r 7 -s 500输出会列出“would remove”的文件。确认列表无误后再加-f实际执行./log_cleanup.sh -d /var/log/app -r 7 -s 500 -f执行后检查日志目录ls -lh /var/log/app | head -204.3 用 shellcheck 做静态校验无论脚本是生成的还是手写的都建议过一遍 shellcheckshellcheck -x batch_inspect.sh shellcheck -x log_cleanup.sh如果提示SC2086未加引号的变量说明有变量引用需要补双引号如果提示SC2181直接检查$?建议改成if command; then结构。这些警告在批量操作场景下往往就是事故隐患。5. 本篇常见错排查5.1 脚本在本地能跑远程执行报“command not found”原因通常是远程主机的PATH和本地不同或者ssh非交互式登录不加载.bashrc。解决办法是在远程命令里用绝对路径或者在脚本开头显式设置ssh -o BatchModeyes $host PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; your_command5.2set -e导致 grep 未匹配时脚本退出grep -c在没有匹配行时返回退出码 1配合set -e会让脚本直接退出。处理方式是加|| trueERROR_COUNT$(grep -c -i ERROR $LOG_FILE || true)或者用if grep -q ...; then结构。5.3 并发执行时输出交错多个后台进程同时写同一个文件会导致 JSON 行交错、无法解析。解决办法是每个进程写独立临时文件最后合并tmp_dir$(mktemp -d) # 每个任务写 $tmp_dir/$host.json # 最后 cat $tmp_dir/*.json result.jsonl5.4 日志清理脚本误删正在写入的文件如果日志文件正在被应用写入直接rm可能导致应用报错文件句柄还在但目录项没了。更安全的做法是先truncate再删除或者只清理明确不再写入的归档日志# 只清理 .log.1 .log.2.gz 这类归档文件 find $LOG_DIR -type f \( -name *.log.1 -o -name *.log.*.gz \) -mtime $RETAIN_DAYS -print05.5 提示词里没写清楚生成的脚本缺关键逻辑Claude Code 生成质量高度依赖提示词。如果生成的脚本没有输入校验、没有超时、没有日志不要直接改脚本而是把缺失点补进提示词重新生成。比如加上“必须验证 hosts.txt 每行格式非法行跳过并记录到 error.log”。迭代两三轮脚本质量会明显提升。6. 把脚本生成接进你的日常流程如果你已经跑通了上面的巡检和清理脚本下一步可以把“生成脚本”这件事本身自动化。比如在 CI 里加一个步骤读取需求描述文件调用 TaoToken API 生成脚本跑 shellcheck通过后提交到仓库。API 接入方式参考 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。如果你需要长期做编码和 Agent 类任务Coding Plan 入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。想先快速验证模型输出可以直接用模型对话 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 试几条提示词看看生成的脚本骨架是否符合你的预期。最后留一个我踩过的坑生成的脚本一定要先在测试环境跑 dry-run尤其是涉及删除、重启、权限变更的操作。模型能帮你写出结构完整的代码但“这条命令在这台机器上到底会做什么”只有你自己确认过才算数。
返回列表