2016-09-27 82 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