我尝试使用sed和Python将配置文件中的HASH添加到配置文件中(全部在一行中,分为3行以便于阅读):
sed "s/SECRET_KEY.*/SECRET_KEY = $(python -c 'import crypt,getpass;
print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA256)))')/"
settings.py > settings.tmp
我一直收到这条标准信息:
sed: -e expression #1, char 60: unknown option to `s'
然而,当我跑步时:
sed "s/SECRET_KEY.*/SECRET_KEY = $(python -c 'import crypt,getpass;
print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA256)))')/"
settings.py |grep -i secret
似乎返回以下内容:
SECRET_KEY = $5$EQq9GhgCBcL7P5kN$hnwmvYe7lBhJOxHJx768VdCjLOxpnRuTWkkzGycNP.B
为什么没有写入文件就可以工作,但如果我写一个文件就不行?
答案 0 :(得分:1)
问题在于,您无法保证SECRET_KEY
不包含/
个字符。第60列位于密钥内。
由于您没有为两个测试输入相同的密码,第二个测试仅仅运气,但第一个测试失败,因为您的python表达式被评估为包含/
的密钥,丢失了{{ 1}}。
为什么不用python来代替,因为你已经使用它了?
sed
脚本:
substkey.py
用法:
import sys,re
import crypt,getpass
passwd = crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA256))
with open(sys.argv[1],"r") as f:
contents=f.read()
new_contents = re.sub("SECRET_KEY.*",'SECRET_KEY = "'+passwd+'"',contents)
print(new_contents)
它要求输入密码并插入密钥(我添加了引号,因为如果它最终是python脚本则需要它)。)