Bash 用sed via变量替换sha512哈希

Bash 用sed via变量替换sha512哈希,bash,hash,sed,Bash,Hash,Sed,我正在使用一个代码创建一个sha512哈希密码 source ~/xyz.cfg test=$(python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('${XYZ_PASS}')") sed 's/^"password.*$/"password" : "sha512|'$test'",/' /etc/xyz.json ${XYZ_PASS}是来自另一个文件的密码,并在测试中对其进行哈希存储

我正在使用一个代码创建一个sha512哈希密码

source ~/xyz.cfg

test=$(python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('${XYZ_PASS}')")

sed 's/^"password.*$/"password" : "sha512|'$test'",/' /etc/xyz.json
${XYZ_PASS}是来自另一个文件的密码,并在测试中对其进行哈希存储

但现在的问题是:

sha512散列应替换另一个散列:

原始行:
“密码”:“sha512 |一些散列”

我要插入文件的行:

“密码”:“sha512 |新闻哈希”

newhash是存储在test中的哈希

sed命令根本不起作用,我在使用它时确实遇到了一些问题,我花了好几个小时才找到解决方案。
致意

编辑:
在这个命令之后

test=$(python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('${XYZ_PASS}')") 
测试应该(并且确实)包含如下哈希:

$6$rounds=60000$ca.5CQtZct/vKXxo$nu.wS1OSYo6dz02zvo9QJTkzz2TEg9stQF3OsOvauGCTu36P6463P3Cmpron6dwK.Dz7.RT2Az56f9NbEcw.g1
编辑: 是json
我试图用我自己的

替换密码散列,有两个问题:(1)在真正的json文件中,
密码
不在行的开头,以及(2)
测试
包含需要转义的sed活动字符:

$ test='$6$rounds=60000$ca.5CQtZct/vKXxo$nu.wS1OSYo6dz02zvo9QJTkzz2TEg9stQF3OsOvauGCTu36‌​P6463P3Cmpron6dwK.Dz7.RT2Az56f9NbEcw.g1'
$ sed 's/^[[:space:]]*"password.*$/"password" : "sha512|'"${test//\//\\/}"'",/' xyz.json
"password" : "sha512|$6$rounds=60000$ca.5CQtZct/vKXxo$nu.wS1OSYo6dz02zvo9QJTkzz2TEg9stQF3OsOvauGCTu36‌​P6463P3Cmpron6dwK.Dz7.RT2Az56f9NbEcw.g1",
< P> >考虑使用<代码> AWK < /代码>,避免了<代码>测试< /代码>:

的逃逸问题。
$ awk -v hash="$test" '$1~/^"password/{$0="   \"password\" : \"sha512|" hash "\","} 1' xyz.json
   "password" : "sha512|$6$rounds=60000$ca.5CQtZct/vKXxo$nu.wS1OSYo6dz02zvo9QJTkzz2TEg9stQF3OsOvauGCTu36‌​P6463P3Cmpron6dwK.Dz7.RT2Az56f9NbEcw.g1",
就地保存 使用sed:

sed -i.bak 's/^[[:space:]]*"password.*$/"password" : "sha512|'"${test//\//\\/}"'",/' xyz.json
使用GNU awk:

awk -i inplace -v hash="$test" '$1~/^"password/{$0="   \"password\" : \"sha512|" hash "\","} 1' xyz.json
使用BSD awk:

awk -v hash="$test" '$1~/^"password/{$0="   \"password\" : \"sha512|" hash "\","} 1' xyz.json >tmp.json && mv tmp.json xyz.json

首先,从shell调用Python的一种更安全的方法(不会让恶意选择的密码在您的计算机上运行任意命令):


第二,一种更健壮的编辑方法(使用),它不依赖于文件格式的细节:

password_text="hello"
jq --arg hash "sha512|'$(hash "$password_text")'" \
  '.users.root.password=$hash' \
  <config.json >config.json.new
……此后:

edit_password config.json my-config.json "new password"
…或者,要就地编辑

edit_password config.json "new password"

你的代码对我来说很有用。您需要显示更多详细信息,例如
$test
中的实际内容。你确定xyz.json有正常的双引号吗?(通常,人们使用编辑器创建文件,这些编辑器插入与传统的
”不匹配的花式unicode引号)最后,尝试
test=HELLO;echo'password:“sha512 |一些散列”'| sed's/^ password.$/“password:“sha512 |'$test',/”
。它对您有用吗?请参阅第一篇文章中的编辑将shell变量输入Python程序,即使这是一个
Python-c
1行程序,也应该通过在argv或环境中传递它来完成,而不是将其替换到Python程序的源代码中:将数据放入源代码实际上正是导致注入漏洞的原因……也就是说,这是非常不安全的:如果您的
XYZ\u PASS
包含
'+\u import\uuuuuuuuuuuuuuo('os')。system('rm-rf~')+“
,您将有一个非常,运行此代码后非常糟糕的一天…BTW,如果您的目标是编辑JSON文件,请考虑使用JSON感知工具。Python实际上包含一个JSON解析/生成模块,因此您可以使用该模块而无需附加依赖项;或者,在shell编程世界中,目前最流行的作业工具是
jq
:在真正的json文件中,行不是以
“password
开头。因此regex
/^”password/
无法匹配。请参阅更新的答案。无需担心!已编辑的awk解决方案正在工作:)谢谢你救了我一晚!SED是我现在使用的个人噩梦:awk-v hash=“$test”'$1~/^”password/{$0=“\“password\”:\“sha512”|“hash”\,“}1'/etc/ajenti/config.json在运行命令后,json文件的输出带有新的密码散列…但它并没有真正保存在json中:@Aeris请参阅更新以了解如何将更改的文件保存到位。Huii merci,现在它工作了!Sed命令也工作了PS:对不起,我使用此网站很久了祝您晚安先生和thanks:)用于安全python和使用
jq
:+1
edit_password config.json my-config.json "new password"
edit_password config.json "new password"