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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:37:23