【发布时间】:2020-11-18 15:54:48
【问题描述】:
我正在编写一个简单的 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} 的值,即使它包含需要转义的字符。
帮助?
【问题讨论】:
-
或"Is it possible to escape regex metacharacters reliably with sed"(答案还包括转义替换字符串,这是这里的问题)。
-
不使用 Shell 和
sed正则表达式替换解析您自己的自定义模板语法,为什么不使用gettext包提供的简单envsubst呢?或者,您的模板可以转换为带有 shell 变量的 heredocument。