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
相关产品推荐
相关产品推荐

