如何在远程服务器自动化任务并提取响应值用于后续命令执行
自动备份传输与Bash curl接口处理方案
1. 自动传输db_backups到Azure冷存储
1.1 前置依赖
- 远程服务器安装Azure CLI 或 AzCopy工具
- 已完成Azure存储账户的身份认证(可通过
az login或者配置AzCopy的SAS令牌实现)
1.2 实现逻辑
- 编写Shell脚本定期检测备份目录总大小,超过指定阈值后触发传输,指定上传到冷存储访问层
- 通过crontab配置定时任务,无需人工值守
1.3 脚本示例
#!/bin/bash # 自定义配置项 BACKUP_DIR="/data/db_backups" # 替换为实际备份目录路径 SIZE_THRESHOLD=$((10*1024*1024*1024)) # 阈值设置为10G,单位字节,可自行调整 AZURE_STORAGE_ACC="your_storage_account" # 替换为Azure存储账户名 AZURE_CONTAINER="cold_backup_container" # 替换为冷存储容器名 # 计算备份目录当前总大小 CURRENT_SIZE=$(du -sb "$BACKUP_DIR" | awk '{print $1}') if [ "$CURRENT_SIZE" -ge "$SIZE_THRESHOLD" ]; then echo "备份目录大小达到阈值,开始传输至Azure冷存储" # 方式1:使用Azure CLI传输 az storage blob upload-batch \ --source "$BACKUP_DIR" \ --destination "$AZURE_CONTAINER" \ --account-name "$AZURE_STORAGE_ACC" \ --access-tier Cool \ --only-show-errors # 方式2:使用AzCopy传输(性能更优) # azcopy sync "$BACKUP_DIR" "https://$AZURE_STORAGE_ACC.blob.core.windows.net/$AZURE_CONTAINER/db_backups/" --access-tier Cool # 传输成功后可添加清理本地旧备份逻辑 # find "$BACKUP_DIR" -type f -mtime +7 -delete fi
1.4 定时任务配置
执行crontab -e添加如下配置,每天凌晨0点执行一次检测,日志写入指定文件:
0 0 * * * /bin/bash /path/to/your/backup_transfer.sh >> /var/log/db_backup_transfer.log 2>&1
2. Bash中curl请求配置与JSON响应提取
2.1 授权头写法注意事项
包含变量的请求头必须使用双引号包裹,单引号会阻止Shell解析变量,导致$token无法被替换为实际值,这是授权报错的核心原因。
2.2 前置依赖
安装jq工具用于解析JSON响应,是Shell处理JSON的标准工具,避免用正则匹配导致的兼容性问题:
# Debian/Ubuntu系 sudo apt update && sudo apt install -y jq # RHEL/CentOS系 sudo yum install -y jq
2.3 完整脚本示例
包含获取access_token、发送POST请求、提取key1的value全流程:
#!/bin/bash # -------------------------- # 步骤1:获取access_token(替换为你实际的获取token的接口参数) # -------------------------- TOKEN_RESP=$(curl -s -X POST "https://your-auth-endpoint.com/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "client_id=your_client_id&client_secret=your_client_secret&grant_type=client_credentials") # 提取access_token,-r参数输出原始字符串不带引号 ACCESS_TOKEN=$(echo "$TOKEN_RESP" | jq -r '.access_token') # 校验token是否获取成功 if [ -z "$ACCESS_TOKEN" ] || [ "$ACCESS_TOKEN" == "null" ]; then echo "获取access_token失败" exit 1 fi # -------------------------- # 步骤2:发送目标POST请求 # -------------------------- API_RESP=$(curl -s -X POST "https://server.domain.com/v2/jobs/28723316-9373-44ba-9229-7c796f21b099/runs?project_id=aff59748-260a-476e-9578-b4f4a93e7a92" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -d '') # -------------------------- # 步骤3:提取key1的value值 # -------------------------- KEY1_VAL=$(echo "$API_RESP" | jq -r '.keys[] | select(.keyName == "key1") | .value') echo "提取到的key1值为:$KEY1_VAL"
2.4 可选:请求状态校验
如果需要判断接口请求是否成功,可通过获取HTTP状态码实现:
# 同时获取响应体和HTTP状态码 FULL_RESP=$(curl -s -w "||%{http_code}" -X POST "你的目标接口地址" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -d '') RESP_BODY=$(echo "$FULL_RESP" | awk -F '||' '{print $1}') HTTP_CODE=$(echo "$FULL_RESP" | awk -F '||' '{print $2}') if [ "$HTTP_CODE" -ne 200 ]; then echo "请求失败,状态码:$HTTP_CODE,响应内容:$RESP_BODY" exit 1 fi
内容的提问来源于stack exchange,提问作者ABHISHEK KUMAR SINGH
相关产品推荐
相关产品推荐

