You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

进程替换调用OpenSSL签名:zsh正常bash报错的问题

问题原因与解决办法

问题出在bash和zsh对进程替换与管道结合时的文件描述符生命周期处理逻辑不同:

  • zsh会维持进程替换生成的文件描述符(比如/dev/fd/63)的存活状态,直到openssl完成读取操作。
  • bash则会在管道左侧的echo "something to sign"执行完毕后,立即关闭进程替换对应的文件描述符。此时openssl才开始尝试读取这个fd,自然会抛出Could not read private key from /dev/fd/63的错误。

修复方案

方案1:改用here-string传递待签名内容

避免管道导致的文件描述符提前关闭,直接用here-string把内容传给openssl:

openssl dgst -binary -sha256 -sign <(echo "certificate to sign with") <<< "something to sign"

方案2:用子shell包裹openssl命令

通过子shell维持进程替换的文件描述符生命周期,确保openssl读取时fd仍可用:

echo "something to sign" | bash -c 'openssl dgst -binary -sha256 -sign <(echo "certificate to sign with")'

额外提醒:openssl dgst -sign参数需要的是私钥文件,而非证书。如果你的实际输入是证书而非私钥,后续可能还会遇到签名失败的问题。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:32:03