2

我想让一个 shell 脚本使用“ldapsearch”来比较文本文件中列出的 UID 和远程 LDAP 目录中的 UID。

我不是 shell 脚本专家,如果有任何帮助,我将不胜感激。以下循环遍历作为参数给出的文本文件,但是当我的文本文件中的 UID 在 LDAP 中不存在时,我需要回显。

#!/bin/sh

for i in `cat $1`;
  do ldapsearch -x -H ldaps://ldap-66.example.com -b ou=People,dc=crm,dc=example,dc=com uid=$i | grep uid: | awk '{print $2}';
  echo $i
done
4

3 回答 3

5

尝试:

#!/bin/sh

url="ldaps://ldap-66.example.com"
basedn="ou=People,dc=crm,dc=example,dc=com"

for i in `cat $1`; do
    if ldapsearch -x -H "$url" -b "$basedn" uid=$i uid > /dev/null
    then
        # Do nothing
        true
    else
        echo $i
    fi
done
于 2012-08-01T04:33:08.400 回答
3

Anttix,这是工作的最终版本。再次感谢。这是否将问题标记为已接受?

#!/bin/sh

url="ldaps://ldap-66.example.com"
basedn="ou=People,dc=crm,dc=example,dc=com"

for i in `cat $1`; do
    if ldapsearch -x -H "$url" -b "$basedn" uid=$i | grep uid: | awk '{print $2}' > /dev/null
    then
        # Do nothing
        true
    else
        echo $i
    fi
done
于 2012-08-01T14:25:28.433 回答
0
#!/bin/sh

uids="${1:?missing expected file argument}"
URL='ldaps://ldap-66.example.com'
BASE='ou=People,dc=crm,dc=example,dc=com'

ldapsearch \
  -x -LLL -o ldif-wrap=no -c \
  -H "$URL" \
  -b "$BASE" \
  -f "$uids" \
  '(uid=%s)' uid |
sed \
  -r -n \
  -e 's/^uid: //p' \
  -e 's/^uid:: (.+)/echo "\1"|base64 -d/ep' |
grep \
  -F -x -v \
  -f - \
  "$uids"

解释

对于ldapsearch部分

  • 您可以只调用ldapsearch -f一次来执行多个搜索并从文件中读取它们$uids
  • (uid=%s)用作每一行的模板,其中为%s每一行填写 。
  • 即使出现-c错误也需要继续,例如当找不到 UID
  • -x强制执行简单的身份验证应该被认为是不安全的。更好地使用 SASL。
  • -LLL将从ldapsearch输出中删除不需要的杂物。
  • -o ldif-wrap=no将防止超过 79 个字符的行被换行 - 否则grep可能只会获取用户名的第一部分。
  • uid告诉只返回该ldapsearch属性并跳过我们不感兴趣的所有其他属性;节省一些网络带宽和处理时间。

对于sed部分

  • -r启用的扩展正则表达式+,(…)转换为运算符;否则它们必须用反斜杠预先固定\
  • -n告诉sed默认情况下不要打印每一行,但只有在使用显式打印命令被告知这样做时p
  • s/uid: //将从包含它的行中去除该前缀。
  • s/uid:: …/…/ep处理像元音变音这样的非 ASCII 字符时需要该部分,因为ldapsearch它们使用base64.
  • 后缀…p将仅打印那些被替换的行。

对于grep部分

  • -F告诉grep不要使用正则表达式模式匹配,而是使用纯文本;如果您的名字包含., *, 括号,...,这将变得很重要。
  • -x强制执行整行匹配,因此搜索foo也不会匹配foobar
  • -f -告诉grep从 STDIN 读取模式,即.找到的现有UID ldapsearch
  • -v反转搜索并将过滤掉那些现有用户
  • $uids再次读取所有请求用户的列表。删除现有用户后,丢失的用户列表将保留。

以前解决方案的问题

以前的解决方案都存在某些问题:

  • 失踪grep
  • 缺少引用,一旦涉及空白就会中断
  • 无用的使用cat
  • use-less use of grepwhenawk也被使用
  • 效率低下,因为对于每个 UID,许多进程都会被fork()编辑
  • 效率低下,因为对每个 UID 执行单独的搜索
  • 不适用于长用户名
  • 不适用于包含正则表达式元字符的用户名
  • 不适用于包含变音符号的用户名
于 2021-11-16T12:43:36.797 回答