如何在Shell中将私钥变量的空格转换行且保留标识行空格?
这个问题我之前也碰到过,确实直接用tr替换所有空格会把标识行前后的空格也处理掉,导致生成的密钥格式不符合标准。给你几个靠谱的解决办法,都是用常用的Shell工具就能搞定的:
方法一:用awk精准拆分处理
awk可以很方便地分割字符串,把标识行和密钥主体分开处理:
echo "$PK" | awk ' BEGIN { # 定义分隔符:匹配BEGIN标识后的空格,以及END标识前的空格 FS = "-----BEGIN RSA PRIVATE KEY----- | -----END RSA PRIVATE KEY-----" } { # 输出开头的标识行 print "-----BEGIN RSA PRIVATE KEY-----" # 把密钥主体里的所有空格替换成换行 gsub(/ /, "\n", $2) print $2 # 输出结尾的标识行 print "-----END RSA PRIVATE KEY-----" }' > key
原理是先把整个字符串拆成三部分:BEGIN标识、密钥主体、END标识,单独处理主体部分的空格替换,最后再把三部分拼起来输出。
方法二:用sed链式替换
sed通过多步替换来精准处理不同位置的空格:
echo "$PK" | sed -e ' # 把BEGIN标识后的空格换成换行,让BEGIN单独占一行 s/-----BEGIN RSA PRIVATE KEY----- /&\n/ # 把END标识前的空格换成换行,让END单独占一行 s/ -----END RSA PRIVATE KEY-----/\n&/ # 最后把剩下的所有空格(只在密钥主体里)替换成换行 s/ /\n/g ' > key
先把标识行和主体分开,再集中处理主体的空格,这样就不会碰标识行的内容了。
方法三:纯Bash内置命令处理(不依赖外部工具)
如果不想用awk或sed,用Bash自身的字符串操作也能搞定:
# 提取开头的BEGIN标识行(从字符串开头到第一个空格前) begin_part="${PK%% *}" # 提取结尾的END标识行(从最后一个空格后到字符串结尾) end_part="${PK##* }" # 提取中间的密钥主体部分 key_body="${PK#$begin_part }" key_body="${key_body% $end_part}" # 把主体里的空格全局替换成换行 key_body="${key_body// /$'\n'}" # 把三部分拼接起来写入文件 cat > key <<EOF $begin_part $key_body $end_part EOF
这里用了Bash的参数扩展功能,%%和##用来截取字符串,//做全局替换,全程不需要调用外部工具。
⚠️ 注意:不管用哪种方法,一定要用echo "$PK"(带双引号),如果不加双引号,Bash会把变量里的连续空白符合并,还会处理通配符,导致密钥内容被破坏。
内容的提问来源于stack exchange,提问作者norshtein
相关产品推荐
相关产品推荐

