我正在编写一个简单的 BASH 脚本来生成 LDIF 文件,然后我可以使用该文件将用户添加到我的 OpenLDAP 服务器。
这是脚本:
#!/bin/bash
#add LDAP user, v1.0, by mbobak, 11/17/2020
if [ $# != 6 ];
then
echo "`basename $0`: error: invalid number of arguments:"
echo "`basename $0` <userid> <firstname> <lastname> <gidnum> <uidnum> <empno>"
exit 1
fi
userid=$1
firstname=$2
lastname=$3
gidnum=$4
uidnum=$5
empno=$6
temppasswd=`slappasswd -s pw4${userid}`
echo ${userid} ${firstname} ${lastname} ${gidnum} ${uidnum} ${empno} ${temppasswd}
sed -e "s/#userid#/${userid}/g" -e "s/#gidnum#/${gidnum}/g" -e "s/#firstname#/${firstname}/g" -e "s/#lastname#/${lastname}/g" -e "s/#uidnum#/${uidnum}/g" -e "s/#empno#/${empno}/g" -e "s/#temppasswd#/${temppasswd}/g" user_tmpl.ldif
我将它与此模板一起使用:
dn: uid=#userid#,ou=people,dc=nitssolutions,dc=com
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: #userid#
gidNumber: #gidnum#
givenName: #firstname#
sn: #lastname#
displayName: #firstname# #lastname#
homeDirectory: /home/#userid#
mail: #userid#@nitssolutions.com
loginShell: /bin/bash
cn: #firstname# #lastname#
uidNumber: #uidnum#
employeeType: INT-FT
employeeNumber: #empno#
dn: uid=#userid#,ou=people,dc=nitssolutions,dc=com
changetype: modify
add: userPassword
userPassword: #temppasswd#
这似乎工作得很好,除了当 slappasswd
的输出包含 /
字符时。
发生这种情况时,我收到以下错误:
./add_ldap_user.sh jdoe John Doe 123456 123456 NS1234
jdoe John Doe 123456 123456 NS1234 {SSHA}kTwHVDBiK4ub3laqwaqZpAUwILrW/Vw9
sed: -e expression #7, char 51: unknown option to `s'
同样,只有当 slappasswd
的输出包含 /
时才会发生这种情况。
我确信我在这里遗漏了一些简单的东西,但我不清楚正确的答案是什么。我不能简单地转义整个表达式,或者我的变量恢复为静态字符串“${temppasswd}”,这没有帮助。我需要 ${temppasswd} 的值,即使它包含需要转义的字符。
帮忙?
最佳答案
this only happens when the output of slappasswd contains a /.
选择不同的s
命令分隔字符。例如 ~
或任何其他字符。
sed -e "s~#userid#~${userid}~g"
在 GNU sed 的边缘情况下,您可以使用任何字节,例如您可以使用 C 转义 $'\x01'
来写入 0x01 字节:
sed -e $'s\x01#userid#\x01'"${userid}"$'\x01g'
但我建议不要重新发明轮子并使用现有的模板工具。将模板格式从 #userid#
更改为 ${userid}
,您可以使用 envsubst
。
关于linux - 字符串的正确转义策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64896613/