Bash脚本中结合heredoc与ldapmodify时无法展开DN的问题排查
问题描述
终端中直接执行以下ldapmodify命令结合heredoc可以正常运行:
/usr/bin/ldapmodify -x -h ldap-master.x-region.COMPANY.com -p 3891 -D "uid=COMPANY-ldap-team-me,ou=ldap users,ou=infrastructure,o=COMPANY.com" -W <<EOF dn: cn=Jeff Lebowski (dude),ou=people,ou=us,o=COMPANY.com changetype: modify replace: nsAccountLock nsAccountLock: false EOF
但编写脚本时,先定义了获取DN的get_dn函数:
get_dn () { /usr/bin/ldapsearch -o ldif-wrap=no -LLLxh ldap.COMPANY.com:389 -b o=COMPANY.com uid=dude | grep -i "dn:" | sed -r '/^\s*$/d' > /dev/null 2>&1 }
接着整合到解锁账户的unlock_account函数中:
unlock_account () { /usr/bin/ldapmodify -x -h ldap-master.x-region.COMPANY.com -p 3891 -D "uid=svc-ldap-team-$USER,ou=ldap users,ou=infrastructure,o=COMPANY.com" -W $(get_dn) cat << EOF changetype: modify replace: nsAccountLock nsAccountLock: false EOF }
调用该函数时heredoc无法正常展开,请问哪里操作有误?
错误分析与修正
1. get_dn函数的核心问题
你的get_dn函数把ldapsearch的结果重定向到了/dev/null,这意味着函数根本不会输出任何内容,后续调用时自然拿不到需要的DN字符串。
修正后的get_dn函数应该直接输出处理后的DN,去掉无效的重定向:
get_dn () { /usr/bin/ldapsearch -o ldif-wrap=no -LLLxh ldap.COMPANY.com:389 -b o=COMPANY.com uid=dude | grep -i "dn:" | sed -r '/^\s*$/d' }
2. unlock_account函数的结构错误
原函数中ldapmodify命令单独执行,没有接收后续的输入内容;$(get_dn) cat <<EOF的写法完全错误,既没有把DN和heredoc内容合并,也没有传递给ldapmodify的标准输入。
以下是两种可行的修正方式:
方式一:用代码块合并输出后通过管道传递
unlock_account () { { get_dn; cat <<EOF changetype: modify replace: nsAccountLock nsAccountLock: false EOF } | /usr/bin/ldapmodify -x -h ldap-master.x-region.COMPANY.com -p 3891 -D "uid=svc-ldap-team-$USER,ou=ldap users,ou=infrastructure,o=COMPANY.com" -W }
方式二:先保存DN到变量,再在heredoc中引用
unlock_account () { local user_dn=$(get_dn) /usr/bin/ldapmodify -x -h ldap-master.x-region.COMPANY.com -p 3891 -D "uid=svc-ldap-team-$USER,ou=ldap users,ou=infrastructure,o=COMPANY.com" -W <<EOF $user_dn changetype: modify replace: nsAccountLock nsAccountLock: false EOF }
注意:如果get_dn输出的DN已经包含dn:前缀(比如ldapsearch返回的是dn: cn=Jeff Lebowski...),上述写法直接可用;如果去掉了dn:前缀,需要在heredoc中手动补全为dn: $user_dn。
内容的提问来源于stack exchange,提问作者eekfonky
相关产品推荐
相关产品推荐

