2016-09-27 81 views
0

我试图同时使用SED和Python使用下面的一个HASH添加到一个配置文件(全部在同一行,在3线细分为便于阅读):如何将Python哈希插入sed查询并写入文件?

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 

为什么它会在不写入文件的情况下运行,但如果我写入文件却不行?

回答

1

问题是,您不能保证您的SECRET_KEY不包含/字符。列60在密钥内。

既然你没有输入为您的测试相同的密码,第二次测试徼工作,但第一个失败,因为你的Python表达式计算包含在它/密钥,失去sed

为什么不用python来做,因为你已经使用它了?

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) 

用法:

substkey.py settings.py > settings.tmp 

它要求的密码,将钥匙(我加了引号,因为如果它是在最后一个python脚本,将需要:) )

+0

啊,你是对的,很好找!我甚至没有想到嵌​​入的'/'字符。 Python很棒,但这只是BASH脚本的一小部分。我最终使用'$(cat/dev/urandom | tr -dc'a-zA-Z0-9'| fold -w 32 | head -n 1)'代替。 – hobbes