【问题标题】:Create shell script for ldapsearch with input file使用输入文件为 ldapsearch 创建 shell 脚本
【发布时间】:2015-12-10 21:41:29
【问题描述】:

我有一个文本文件中的用户列表。我需要查询我们的校园活动目录以确保这些用户仍然是“活动”用户(我的机器不是校园广告的一部分)。用户列表映射到 AD 上的许多相同属性(name、cn、sAMAccountName、uid、gecos)。我可以使用 ldapsearch 成功查询个人用户的广告,所以我想弄清楚的是:

a) 如何使用文件作为查询的输入

b) 如何构建一个 shell 脚本,以便查询将逐行执行,然后输出任何“非活动”用户,以便我可以通过电子邮件发送通知。

非常感谢任何帮助。

【问题讨论】:

  • 试试while read -r line; do myldapsearch "${line}"; done < userlist 之类的东西,看看你卡在哪里了。

标签: bash shell scripting active-directory ldap-query


【解决方案1】:

你可以尝试完成你想要的事情是:

emailFile="/var/tmp/emailFile.txt"
for i in $(cat ${filename}) ; do
  results=$(*INPUT LDAPSEARCH HERE REPLACING USERNAME WITH ${i}* | grep -i lastlogontimestamp)
  if [[ ${results} != "" ]] ; then
    echo "${i} appears to be an active user"
  else
    echo "${i} IS INACTIVE"
    echo "${i}" >> "${emailFile}"
  fi
done

这不是一个工作脚本,但它应该让您很好地了解如何让它在您的环境中工作。需要注意的几件事...

${filename} = 您的姓名列表的位置/文件名

INPUT LDAPSEARCH HERE REPLACING USERNAME WITH ${i} = 您将在此处输入命令以运行 ldap 搜索。 示例 $(ldapsearch -D "cn=manager" -w 密码 -h server.example.com -b "dc=example,dc=com" "cn=${i}" | grep -i "lastlogontimestamp")

“lastlogontimestamp”将等于您要检查的查询部分以确定用户是否处于活动状态。

这会将 ${results} 变量设置为您要查找的字符串。如果用户从未登录,这可能是一个日期戳或空。

下一个“if”语句会将结果与您期望的字符串/模式进行比较。我上面的 if 语句指出,如果 ${results} 不等于空,则通知您您搜索的用户处于活动状态。如果 ${results} 确实为空,则记录用户名。

您必须修改 ldapsearch 部分以满足您的需要,如果用户不活跃,您必须修改 if 语句以匹配您期望从查询中看到的内容。我希望这会有所帮助。

【讨论】:

  • 这太棒了——正是我想要的。注意:echo "${i} >> ${emailFile}" 行实际上应该是:echo "${i}" >> "${emailFile}",当文件没有被创建时我注意到了。非常感谢!!
  • 完全没问题。谢谢你的收获。我相应地更新了我的答案。我附近没有系统可以测试它,否则我会事先发现它。
  • 在进一步玩弄它时,我想我想查询的是“UserAccountControl”作为属性。如果值为“514”或“546”,则该用户将被 grep 到该文件。如果用户帐户是否“启用”(这确实是我需要的信息),这将给我一个更好的指示。是否可以添加第二个“或”条件来同时使用 514 和 546(也许还有其他)?我目前有两个脚本,每个脚本都可以工作,但似乎可以组合(如果我知道如何编写的话)。
  • 我还注意到,如果我添加一个不在 AD 中的虚拟用户,它仍然报告为“似乎处于活动状态”。我以为如果它没有找到它会出错,但我猜这需要一个额外的条件?
  • 如果您可以粘贴您的脚本,我将能够提供更详细的答案。希望我下面的第二个答案是搜索多个字符串以及在彼此内部运行多个 if 语句的一个很好的参考。您可以让第一个“if”语句检查用户是否通过某种类型的搜索/变量存在,第二个“if”语句可以 grep 查找 514\|546,如果找到,则将用户名发送到文件。只是一些想法。
【解决方案2】:

回答您在 cmets 中提供的问题...

您可以使用嵌套的 if 表达式。示例。

if [[ $(some command) = "Some expected result" ]] ; then
  if [[ ${results} != "" ]] ; then
    echo "${i} appears to be an active user"
  else
    echo "${i} IS INACTIVE"
    echo "${i}" >> "${emailFile}"
  fi
fi
done

您可以在 for 循环中运行命令的位置添加第二个变量,例如

userExists=$(some ldapsearch command to see if user exists)
results=$(*INPUT LDAPSEARCH HERE REPLACING USERNAME WITH ${i}* | grep -i lastlogontimestamp
if [[ ${userExists} = "Some expected result" ]] ; then
  if [[ ${results} != "" ]] ; then

您还询问了有关使用“grep”查找多个项目的问题。示例如下。

grep "514\|546"

示例 2。 假设我有一个名为 test.txt 的文件,有 5 行

one
two
three
four
five

我会运行以下命令在文件中查找“二”和“三”

cat test.txt | grep "two\|three"

【讨论】: