Shell新手求助:如何将wget的JSON响应存入变量
如何将wget获取的JSON响应存入shell变量并提取指定字段?
一、解决wget权限错误的核心问题
你遇到的Permission denied是因为wget默认会尝试把HTTP响应保存为URL中指定的文件名(即带长查询参数的auth.cgi?api=SYNO.API.Auth&...),但当前工作目录没有写入权限。只需让wget把响应输出到标准输出(而非文件)即可解决:
# 用wget获取响应并直接输出到stdout,不创建文件 response=$(wget -qO- "http://192.168.1.100:5000/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=3&account=USER&passwd=PASSWD&session=SurveillanceStation&format=sid")
参数说明:
-q:安静模式,关闭wget的日志输出-O-:将响应内容输出到标准输出(-代表stdout)
如果习惯用curl,也可以用更简洁的写法:
response=$(curl -s "http://192.168.1.100:5000/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=3&account=USER&passwd=PASSWD&session=SurveillanceStation&format=sid")
-s:安静模式,隐藏curl的进度信息
二、提取JSON中的success和sid字段
要解析JSON,推荐使用jq工具(大部分Linux发行版可通过包管理器安装,比如apt install jq或yum install jq)。
- 提取success状态:
success=$(echo "$response" | jq -r '.success')
-r:输出原始字符串(不带JSON字符串的引号)
- 提取sid值:
sid=$(echo "$response" | jq -r '.data.sid')
三、完整逻辑示例
# 获取响应 response=$(wget -qO- "http://192.168.1.100:5000/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=3&account=USER&passwd=PASSWD&session=SurveillanceStation&format=sid") # 提取字段 success=$(echo "$response" | jq -r '.success') sid=$(echo "$response" | jq -r '.data.sid') # 验证并使用 if [ "$success" = "true" ]; then echo "登录成功,SID: $sid" # 这里可以添加使用sid的后续操作 else echo "登录失败,请检查账号密码或API参数" fi
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

