You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenSearch脚本写入哈希值异常:变量解析导致内容缺失求助

解决bash脚本中哈希值$符号被解析导致写入不完整的问题

问题说明

现有bash脚本片段如下,意图将生成的密码哈希值完整写入OpenSearch的内部用户配置文件/etc/opensearch/opensearch-security/internal_users.yml:

sudo bash -c "printf '%s
' \
'user-test:' \
'  hash: \"$HASHED_PASSWORD\"' \
'  reserved: true' \
'  backend_roles:' \
'    - \"admin\"' \
'  description: \"admin user\"' >> /etc/opensearch/opensearch-security/internal_users.yml"

其中$HASHED_PASSWORD由/usr/share/opensearch/plugins/opensearch-security/tools/hash.sh生成,格式示例为$2y$12$M44wSxuwYbYRUqRKf1IUAuY5jvBlh4tu5XVx7/PO6SqvPjuXzJaCK。但由于哈希值中的$2、$12、$M被bash当作变量解析,实际写入文件的哈希值丢失了大部分内容,仅保留y2/PO6SqvPjuXzJaCK。

可行解决方案

方案1:转义哈希值中的$符号

在将哈希值传入bash -c之前,把所有$替换为\$,阻止bash将其解析为变量:

# 转义哈希值中的$符号
ESCAPED_HASH=$(sed 's/\$/\\$/g' <<< "$HASHED_PASSWORD")

sudo bash -c "printf '%s
' \
'user-test:' \
'  hash: \"$ESCAPED_HASH\"' \
'  reserved: true' \
'  backend_roles:' \
'    - \"admin\"' \
'  description: \"admin user\"' >> /etc/opensearch/opensearch-security/internal_users.yml"

方案2:调整bash -c的引号嵌套逻辑

用单引号包裹整个bash -c的命令内容,仅在引用$HASHED_PASSWORD时临时关闭单引号,确保变量被正确替换且哈希值中的$不被二次解析:

sudo bash -c 'printf "%s\n" \
"user-test:" \
"  hash: \"'"$HASHED_PASSWORD"'\"" \
"  reserved: true" \
"  backend_roles:" \
"    - \"admin\"" \
"  description: \"admin user\"" >> /etc/opensearch/opensearch-security/internal_users.yml'

方案3:简化执行逻辑,避免嵌套shell解析

直接使用sudo执行printf并重定向输出,减少一层shell解析,此时仅当前shell会解析$HASHED_PASSWORD,哈希值中的$会原样保留:

sudo printf '%s\n' \
'user-test:' \
"  hash: \"$HASHED_PASSWORD\"" \
'  reserved: true' \
'  backend_roles:' \
'    - \"admin\"' \
'  description: \"admin user\"' >> /etc/opensearch/opensearch-security/internal_users.yml

内容的提问来源于stack exchange,提问作者Ayush Agarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:05:13