好的,所以我两周前才开始编写 bash 脚本,上周我遇到了一个我无法解决的问题。我会尽我所能描述我的问题,并且我已经包含了我的脚本。我欢迎对我在这段代码中做错的任何批评;实际上,我恳请您尽可能多地批评我的技术,以便我从中学习。
目标
我为我的公司安装了一个新的Zimbra Collaboration Suite ,并且正在迁移用户帐户。我正在尝试创建一个 bash 脚本来执行以下操作:
- 通过 LDAP 从活动目录中提取所有用户帐户。
zmprov ca
格式化要在命令中使用的 LDAP 查询结果。- 枚举格式化结果的行。
- 遍历每一行并将其作为
zmprov
命令运行。
本示例的假设
- bash 文件的名称 = zdap
- 我的 Active Directory 域 = MYLOCALDOMAIN
- 我的 LDAP 用户名 = admin
- 我的 LDAP 密码 = P@ssw0rd
- 我的 LDAP IP 地址 = 1.2.3.4
脚本
这是我的脚本:
#!/bin/bash
#Use this script to pull user information from Company Active Directory
argerror="Usage: company-ldap domain username"
if [ "$1" == "local" ]; then
domain=MYLOCALDOMAIN
ou=MAIN
else
echo "$argerror"
exit
fi
if [ -z $2 ]; then
echo "$argerror"
exit
else
user=$2
fi
password=P@ssw0rd
ldapsearch -h 1.2.3.4 -p 389 -D "cn=$user,ou=$ou,dc=$domain,dc=COM" \
-w "$password" -b "ou=$ou,dc=$domain,dc=COM" \
"(&(name=*)(mail=*)(givenName=*)(sn=*))" \
'name' 'mail' 'givenName' 'sn' -LLL -S 'name' |
grep -B 1 'name\|mail\|sn\|givenName' |
grep -v '^dn:' | tr '\n' ' ' |
sed -e 's/ -- /\n/g' |
awk '{s=""; for (i=1;i<NF;i++) s = s $i " ";print $NF " " s}' |
sed -e 's/sn: /sn '\''/g' |
sed -e 's/ givenName: /'\'' gn '\''/g' |
sed -e 's/ mail: / /g' |
sed -e 's/ name: /'\'' displayName '\''/g' |
awk '{print "ca " $0"'\''"}' |
sed -e 's/ '\''$/'\''/g' |
awk '{($2 = $2 " tempzimbrapw1234"); print $0}' |
while read line ; do zmprov $line ; done
我用这个调用命令:
./zdap local admin
请求编辑...给定用户 (Joe Smith)
的zmprov
命令如下所示:
zmprov ca joe.smith@mylocaldomain.com tempzimbrapw1234 sn 'Smith' gn 'Joe' displayName 'Joe Smith'
结果和我的问题
- ldap 查询运行完美(例如,如果我单独运行该命令,它将返回正确的 ldap 结果...所以问题与 LDAP 凭据/连接/查询无关)。
- 如果我回显命令,它看起来也很好(例如,如果我键入命令以匹配回显的版本,它实际上会添加我想要的帐户)。
但是,当我运行我编写的 zdap bash 脚本时,我希望从 Zimbra 获得创建帐户确认,但收到以下消息:
zimbra@CPU-00154:~$ ./zdap local admin
usage: createAccount(ca) {name@domain} {password} [attr1 value1 [attr2 value2..
For general help, type : zmprov --help
不幸的是,我尝试了太多解决方案,无法在此处全部列出。我花了一周时间阅读手册、论坛等,并尝试了大量的调整、调整、新命令等,但无济于事。
再一次,对于我的脚本或完成此任务的整体方法的任何批评,我将不胜感激。请尝试在您的建议中包含示例,以便我可以在这里看到我做错了什么。先感谢您。
编辑:
我想我应该包括 LDAP 查询结果的格式,这样你就可以看到我的命令正在处理什么:
dn: CN=admin,OU=MAIN,DC=MYLOCALDOMAIN,DC=COM
name: admin
mail: admin@mylocaldomain.com
--
dn: CN=Jane Doe,OU=MAIN,DC=MYLOCALDOMAIN,DC=COM
name: Jane Doe
mail: jane.doe@mylocaldomain.com
--
dn: CN=Joe Smith,OU=MAIN,DC=MYLOCALDOMAIN,DC=COM
name: Joe Smith
mail: joe.smith@mylocaldomain.com
更新
我设法使用printf
命令解决了这个问题(特别感谢rici的建议)。printf 的输出是这样的……
<|zmprov|> <|ca|> <|joe.smith@mylocaldomain.com|> <|tempzimbrapw1234|> <|#|> <|sn|> <|'Smith'|> <|gn|> <|'Joe'|> <|displayName|> <|'Joe|> <|Smith'|>
如您所见,最后一个参数 (displayName) 的值被误解了。