我正在编写一个创建用户帐户的 bash 脚本。用户名和密码哈希值是根据特定标准从文件中提取的。密码哈希自然包含分隔哈希字段的“$”(例如,$1${SALT}$...)。
问题是 -p 选项useradd
需要用单引号将密码哈希括起来,以防止“$”字段作为变量进行插值。传递变量时,为了正确插入它,引号需要是双引号。单引号将变量视为字符串。
但是,如果我用双引号传递变量,则该变量将被扩展,然后每个“$”将被视为变量,这意味着密码永远不会正确设置。更糟糕的是,某些变量中带有大括号(“{”或“}”),这使事情变得更加糟糕。
如何传递这样的值并确保它完全插值并且不被 shell 修改?
所有插值变量都完好无损的特定代码行的示例:
# Determine the customer we are dealing with by extracting the acryonym from the FQDN
CUSTACRO=$(${GREP} "HOST" ${NETCONF} | ${AWK} -F "." '{print $2}')
# Convert Customer acronym to all caps
UCUSTACRO=$(${ECHO} ${CUSTACRO} | ${TR} [:lower:] [:upper:])
# Pull the custadmin account and password string from the cust_admins.txt file
PASSSTRING=$(${GREP} ${CUSTACRO} ${SRCDIR}/cust_admins.txt)
# Split the $PASSSTRING into the custadmin and corresponding password
CUSTADMIN=$(${ECHO} ${PASSSTRING} | ${CUT} -d'=' -f1)
PASS=$(${ECHO} ${PASSSTRING} | ${CUT} -d'=' -f2)
# Create the custadmin account
${USERADD} -u 20000 -c "${UCUSTACRO} Delivery Admin" -p "${PASS}" -G custadmins ${CUSTADMIN}
编辑:扩展代码以获得更多上下文。
当您assign to $PASS
。双引号不会递归扩展变量。
Observe:
$ foo=hello
$ bar=world
$ single='$foo$bar'
$ double="$foo$bar"
$ echo "$single"
$foo$bar
$ echo "$double"
helloworld
引号仅影响 shell 解析文字字符串的方式。 shell 唯一一次查看变量“内部”是当您根本不使用任何引号时,即使这样,它也只进行分词和通配符扩展。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)