如何将curl执行结果存入变量?为何赋值的user_token与PHPSESSID不更新
核心原因
- Shell变量为静态赋值逻辑:执行
变量=$(命令)语句时,仅会当场运行一次命令,将当时的返回结果写入变量,后续如果不重新执行赋值语句,变量值不会自动更新。你直接手动执行curl命令时每次都会发起新的请求,因此拿到的是动态变化的最新值,和变量固定值的表现存在差异。 - 你写的curl命令本身存在参数错误,也是结果不符合预期的诱因:
- 第一条命令中的
-l不属于curl的有效常规参数,多余的错误参数可能导致返回结果异常 - 第二条命令中的
-c参数作用是将响应返回的Cookie写入指定本地文件,后面必须跟文件路径,不能直接跟请求URL,写法不符合curl参数规范 - 两条命令的awk语句末尾多了多余的
/符号,属于语法错误
- 第一条命令中的
正确实现方案
如果需要每次获取最新的user_token和PHPSESSID,可选两种实现方式:
- 每次使用变量前重新执行赋值语句
# 每次需要使用最新值前先运行下方两行 CSRF_token=$(curl "http://127.0.0.1/DVWA-master/login.php" | awk '/user_token/ {print $4}') PHPSESSID=$(curl -i "http://127.0.0.1/DVWA-master/login.php" | awk '/^Set-Cookie: PHPSESSID/ {split($3,a,";"); print a[1]}')
- 封装为Shell函数,调用即可自动更新两个变量的值
# 仅需定义一次函数 get_dvwa_auth() { temp_resp=$(curl -i "http://127.0.0.1/DVWA-master/login.php") PHPSESSID=$(echo "$temp_resp" | awk '/^Set-Cookie: PHPSESSID/ {split($3,a,";"); print a[1]}') CSRF_token=$(echo "$temp_resp" | awk '/user_token/ {print $4}') } # 后续每次需要最新值时调用函数即可 get_dvwa_auth # 调用后即可使用更新后的 $CSRF_token 和 $PHPSESSID 变量
注意:你原本的写法分两次发起独立curl请求,拿到的PHPSESSID和user_token不属于同一会话,后续用于登录验证会直接失败。上面的示例采用单次请求同时提取两个值的逻辑,保证两者的会话匹配。
内容的提问来源于stack exchange,提问作者Alvaro Garcia
相关产品推荐
相关产品推荐

