【问题标题】:Automating ldapsearch with bash using variables使用变量使用 bash 自动化 ldapsearch
【发布时间】:2020-02-20 13:47:36
【问题描述】:

我执行类似的 ldapsearch

ldapsearch -D "cn=ldapadm,dc=test,dc=com" -w ldappasswd -b "dc=test,dc=com" objectclass=*

而且效果很好。

现在我想用变量替换输入:

BASEDN="cn=ldapadm,dc=test,dc=com"
PASSWD="ldappasswd"
BINDDN="dc=test,dc=com"

ldapsearch -D "${BASEDN}" -w "${PASSWD}" -b "${BINDDN}" objectclass=*

但我得到了一个

ldap_bind: Invalid credentials (49)

错误... 这里有问题的部分是 PASSWD 替换。其他两个替换工作正常。

我在 VirtualBox 上使用 CentOS7。 密码不包含特殊字符。

我在这里错过了什么?

【问题讨论】:

  • 它应该工作,从你所展示的。 ldappasswd 是否包含 $" 或其他魔术字符?
  • 不确定它是否能解决您的问题,但您应该引用您的星号,即 "objectclass=*" 而不是 objectclass=*
  • 您可以通过设置 xtrace 选项查看确切传递的内容:set -x; ldap -D "${BASEDN}" -w "${PASSWD}" -b "${BINDDN}" objectclass=*,它将在变量扩展后将命令行输出到 stderr。请运行有效的命令(不带变量)和无效的命令,看看是否有区别。希望您会看到一个特殊字符是不同的,或者可能是变量开头或结尾的空格。 PS。您可以通过调用 set +x 来禁用 xtrace 选项
  • 另外,将密码作为命令行参数传递是一种不好的做法,因为每个登录的用户都可以解析正在运行的进程的参数,包括其他用户的进程。您可以改用-y passwdfile 选项,并使用专用于打算运行 ldapsearch 命令的用户读取的文件。顺便说一句,它也可以解决您的问题。
  • 感谢 vdavid。那成功了。你想发表你自己的答案,以便我可以给你学分吗?

标签: bash virtualbox centos7 openldap


【解决方案1】:
set -x; ldapsearch -D "${BASEDN}" -w "${PASSWD}" -b "${BINDDN}" objectclass=*

揭示了问题。我从文件中加载了值,每个字符串的末尾都有一个不可见的换行符。

输出:

ldapsearch -D cn=ldapadm,dc=test,dc=com\r -w ldappasswd\r -b dc=test,dc=com\r objectclass=*

我删除了\r调用

PASSWD=`echo "${value_from_file}"| sed 's/\\r//g'`

它成功了。

【讨论】:

    【解决方案2】:

    你可以使用 echo -n "password-here" > 密码文件

    或者,设置为环境变量

    读取 -s “密码” 读取 -s -p "密码:" 密码 密码:这里输入密码 回声-n $密码| ldapsearch -LLL -D cn=whatever,o=whateverelse -y /dev/stdin

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2016-12-17
      相关资源
      最近更新 更多