linux - 字符串的正确转义策略

标签 linux bash sed escaping

我正在编写一个简单的 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/

相关文章:

java - Linux 中 USB 串行端口发生意外变化

CreateProcess + CREATE_SUSPENDED 标志在 Linux 中是否等效?

python - 如何在 Linux 下将 EDB(ms 交换存储文件)提取到 PST? (最好是Python)

bash - 如何将反斜杠参数传递给脚本?

arrays - 如何处理 Bash 中元素包含空格的数组?

bash - 如何使用 sed 在给定行范围/模式内的匹配之前添加行?

c - 参数计数正确时参数太少无法运行

regex - 如何使用 grep 对多个文本字符串进行反向搜索

linux - 更新特定行中文本文件中的特定字段

linux - 需要一个 awk/sed/cut 替代方案来解决 tcpdump 输出上看起来很简单的问题