命令在Shell终端正常执行,嵌入脚本时提示openssl未找到
问题排查:脚本中执行consDownload.cgi提示openssl命令未找到
现象
- 直接在终端执行命令可正常输出:
greatwall:nobody:/v6/centera/cnaccs> ./consDownload.cgi 277756541642 5 0 CI,JPJA,ETD,0b0dbba1d2f1278H,202209081947|CO,JPJA,ETD,0b0dbba1d2f1278H,202209081947|AWB,JPJA,ETD,0b0dbba1d2f1278H,202209081947| - 将命令嵌入Shell脚本执行时报错,脚本执行代码:
op=$(./consDownload.cgi "$AWB" "5" "0" 2>&1) timeStamp "op=$op" - 日志中错误信息:
op=./consDownload.cgi: line 148: openssl: command not found
相关代码片段
consDownload.cgi第148行附近代码:
OPENSSL="openssl" AUTHZID="APP83" SERVICEID="APP5285" PRIVATEKEY="./app83.pem" TOKEN="$(echo -n "$SERVICEID:$(TZ=Asia/Singapore date +%s)000" | "$OPENSSL" rsautl -inkey "$PRIVATEKEY" -sign -pkcs | base64 -w 0)" TOKEN="v1:$AUTHZID:$TOKEN:$AUTHZID"
环境确认
服务器已安装openssl,终端执行openssl version可正常返回:
greatwall:nobody:/v6/centera/cnaccs> openssl version OpenSSL 1.0.2q 20 Nov 2018
原因分析与解决方法
核心原因
脚本非交互式执行时的PATH环境变量,和终端交互式环境的PATH不一致。终端会加载.bashrc/.profile等配置文件,补充完整的命令路径;而脚本执行时默认的PATH更精简,可能不包含openssl所在的目录,导致系统找不到命令。
解决步骤
- 先在终端执行
which openssl,获取openssl的绝对路径(例如/usr/bin/openssl) - 任选以下一种方式修复:
- 修改consDownload.cgi脚本:将
OPENSSL="openssl"替换为绝对路径:OPENSSL="/usr/bin/openssl" # 替换为实际获取到的路径 - 在调用脚本中补全PATH:在执行
consDownload.cgi前,将openssl所在目录添加到环境变量:PATH=$PATH:/usr/bin # 替换为实际openssl所在目录 - 不推荐在脚本中加载终端配置文件(如
source ~/.bashrc),可能引入额外的环境变量冲突问题。
- 修改consDownload.cgi脚本:将
内容的提问来源于stack exchange,提问作者Bjawww
相关产品推荐
相关产品推荐

