如何将Python哈希插入sed查询并写入文件?

时间:2016-09-27 21:35:33

标签: linux bash sed

我尝试使用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

为什么没有写入文件就可以工作,但如果我写一个文件就不行?

1 个答案:

答案 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脚本则需要它)。)