一、问题出现场景

写 Elasticsearch 的 shell 部署脚本,在添加 Elasticsearch 自定义用户时,我执行了下面这条指令。

# read -p '请输入自定义用户admin的密码:' adm_pass
# curl -H "Content-Type:application/json" -u elastic:"$es_pass" -XPOST “$es_ip:9200/_xpack/security/user/admin” -d '{"username":"admin","password":"$adm_pass","roles":["admin"],"full_name":"admin","email":null,"metadata":{},"enabled":"true",}'

执行后出现了如下问题,在命令行中的 json 数据内引用了一个变量 $adm_pass ,引用后变量未解析,admin用户的密码被设置成了字符串 $adm_pass ,而不是我输入的自定义密码。

二、解决方法

先了解下 javascript 的 json 数据格式,属性名必须用双引号包裹。

1、var json = '{"name":"admin"}'        //这个是正确的JSON格式
2、var json = '{\"name\":\"admin\"}'    //这个是正确的JSON格式
3、var json = '{name:"admin"}'          //这个是错误的JSON格式
4、var json = '{'name':'admin'}'		//这个是错误的JSON格式

需要注意的是,在 json 数据里的变量需要用单引号 ’ ’ 括起来。这里就是我的命令出现问题的原因。加单引号后问题解决。

# curl -H "Content-Type:application/json" -u elastic:"$es_pass" -XPOST “$es_ip:9200/_xpack/security/user/admin” -d '{"username":"admin","password":"'$adm_pass'","roles":["admin"],"full_name":"admin","email":null,"metadata":{},"enabled":"true",}'

三、总结

curl命令请求json数据中的变量引用方法,总结如下:

1、json 中变量不能解析(我出错的)
'{"password":"$adm_pass"}'

2、json 中变量能解析(执行成功的)
'{"password":"'$adm_pass'"}'

3、我看到网上还有这样的格式,我没有去测试,但是也列出来,后面有空再测试一下
'{"password":"'"$adm_pass"'"}'
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐