You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Shell:无需临时文件将命令输出文件内容捕获至变量的方法

嘿,你这个需求其实有个更简洁的解决思路——不用把内容混到标准输出再拆分,直接就能把私钥和证书的内容捕获到当前Shell的变量里,而且完全不用临时文件,只运行一次openssl就行。

核心思路是让进程替换直接输出变量赋值的Shell代码,然后用eval执行这些代码,这样变量就会在当前Shell环境中生效,而不是子shell里。

给你两种可靠的写法:

方法一:用sed转义单引号(兼容性好)

eval "$(openssl req -new -newkey rsa:2048 -subj / -days 365 -nodes -x509 \
  -keyout >(echo "key='$(cat | sed "s/'/'\\\''/g")'") \
  -out >(echo "cert='$(cat | sed "s/'/'\\\''/g")'") 2>/dev/null)"

方法二:用printf %q自动转义(更严谨)

如果你用的是Bash或者支持printf %q的Shell,这个方法更稳妥,能自动处理所有Shell特殊字符:

eval "$(openssl req -new -newkey rsa:2048 -subj / -days 365 -nodes -x509 \
  -keyout >(printf 'key='; printf "%q" "$(cat)") \
  -out >(printf 'cert='; printf "%q" "$(cat)") 2>/dev/null)"

执行完上面的命令后,你直接用$key就能拿到私钥内容,$cert拿到证书内容,完全不用再处理拆分的问题。

原理简单说下:

  • -keyout >(...)-out >(...) 分别把openssl生成的私钥、证书导向进程替换里的命令
  • 进程替换里的命令会把内容转义后,输出成key='xxx'cert='xxx'这样的赋值语句
  • eval会在当前Shell中执行这些赋值语句,变量自然就可用了

内容的提问来源于stack exchange,提问作者silverwind

火山引擎 最新活动