繁体   English   中英

用不同字节的熵替换文件中出现的字符串

[英]Replace occurrences of a string in file with different bytes of entropy each

在 Linux 上,我需要以编程方式替换.env文件中的占位符字符串,例如<SECRET> ,如下所示:

KEY=<SECRET>
ANOTHER_VARIABLE=another-value
# here's a comment
PASSWORD=<SECRET>

需要注意的是,这个占位符的每次出现都必须用 Base64 编码的随机性的不同实例替换——例如来自 OpenSSL,因为它在许多 Linux 上都很容易获得。

阅读这个答案,我用 GNU sed 4.8 尝试了这个:

sed -i '0,/<SECRET>/ s__'$(openssl rand -base64 42)'_' .env

(在替换部分,选择了替代分隔符_ ,因为 Base64 编码的字节可以包含/+字符,否则在无意中用作分隔符时会发生冲突。)


这适用于单个替换,一次一个调用。

但是 sed 的返回码始终为0 ,即使所有出现的正则表达式都已被消耗和替换...

问题:当占位符用完时,有没有办法让 sed 返回非零代码?

(如果这不能用 sed 完成,我很高兴使用 awk 或类似的任何解决方案。)

您可以使用grep代替sed

grep '<SECRET>' .env

来自man grep

退出状态

通常,如果选择了一行,退出状态为 0,如果没有选择任何行,则退出状态为 1,如果发生错误,则退出状态为 2。 但是,如果使用 -q 或 --quiet 或 --silent 并选择了一行,即使发生错误,退出状态也是 0。

如果返回值为 0,则应用sed命令来执行替换。

$ awk '
    BEGIN { cmd = "openssl rand -base64 42" }
    match($0,/<SECRET>/) {
        val = ( (cmd | getline line) > 0 ? line : "N/A" )
        $0 = substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
        close(cmd)
    }
1' file
KEY=hDc3Bw4J9+TUbbhw4cNKda+mDHVRGGrAWUU6LX7aYZnWwDZWyqrmzi3z
ANOTHER_VARIABLE=another-value
# here's a comment
PASSWORD=LzGaB43Mm5mF6tsJnwOLqgeeoTwajH9FNLty9yD22QovadhwWKpr7AP6

或者如果<SECRET>可以在 1 行上多次出现,则:

$ awk '
    BEGIN { cmd = "openssl rand -base64 42" }
    {
        while ( match($0,/<SECRET>/) ) {
            val = ( (cmd | getline line) > 0 ? line : "N/A" )
            $0 = substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
            close(cmd)
        }
    }
1' file
KEY=t3/bimGkyPQcjOL6ubV6QmRnPjrvtg4+HvvkuJSnuYCYc+BzOmAWKRV6
ANOTHER_VARIABLE=another-value
# here's a comment
PASSWORD=TKvDbMphOhmhL0/NSQEE2Gs9sFr3Cwt9o3CbOoe9FZPjAR/+m6i4QjcR

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM