【问题标题】:"libcrypto.so.1.0.0: version 'OPENSSL_1.0.1' not found " during shell_exec“libcrypto.so.1.0.0:未找到版本‘OPENSSL_1.0.1’”在 shell_exec 期间
【发布时间】:2016-10-14 14:33:27
【问题描述】:

我在 PHP 中使用 shell_exec 运行 git 命令时遇到了一个奇怪的问题。这是 Ubuntu 16.x LTS 的全新映像,仅安装了 Lampp 的副本和 git 包。在我打算 webhook 的 php 脚本中,运行 shell_exec('/usr/bin/git pull 2>&1') 会打印出以下错误。

ssh: /opt/lampp/lib/libcrypto.so.1.0.0: version 'OPENSSL_1.0.1' not found (required by ssh)
fatal: Could not read from remote repository.`

我可以在命令行中使用git pull 拉取存储库,并且运行 apache 的用户拥有 htdocs 目录中所有文件的所有权。

openssl version -a 结果如下:

OpenSSL 1.0.2g-fips  1 Mar 2016
built on: reproducible build, date unspecified
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN
-DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security
-Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall
-DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5
-DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM
-DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/usr/lib/ssl"

这是 Lamp 5.6.21 的问题,还是我的设置有问题?

【问题讨论】:

  • 听起来你没有从命令行安装openssl
  • 在命令行输入openssl version -a。它是 OpenSSL 1.0.1 还是 1.0.2? (听起来您的远程仓库正在提供针对 1.0.1 构建的二进制文件)。
  • 我已经添加了命令的输出,看起来是1.0.2版本,需要降级吗?
  • @Sidriel - 您可以满足以下条件:(1) 下载/构建 OpenSSL 1.0.1。 (2) 安装在/opt/openssl-1.0.1。 (3) 编写一个脚本来启动 PHP,并使用 LD_LIBRARY_PATH="/opt/openssl-1.0.1/lib:$LD_LIBRARY_PATH" /opt/lampp/bin/php 之类的东西。

标签: php git github ssh openssl


【解决方案1】:

因此,您已将 XAMPP 安装到 /opt/lampp 并尝试通过 shell_exec() 运行本机(如来自 Ubuntu,而不是 XAMPP)git。这个shell运行的环境是什么?这是 XAMPP 与 LD_LIBRARY_PATH 设置 /opt/lampp/lib 一起使用的环境,这是所有 XAMPP 组件绝对需要的(因为它们被构建为使用来自 /opt/lampp/lib 的这些库)。然后 git 继承了同样的环境并且(尽管它在 /lib/x86_64-linux-gnu 的某个地方有来自 Ubuntu 的完美 openssl 库)尝试使用来自 /opt/lampp/lib 的库,砰。

您只需要在调用 git 之前清除 LD_LIBRARY_PATH 环境变量,例如:

$oldldpath = getenv('LD_LIBRARY_PATH');
putenv("LD_LIBRARY_PATH=");
shell_exec('/usr/bin/git pull 2>&1');
putenv("LD_LIBRARY_PATH=$oldldpath");

【讨论】:

  • 在我的情况下,一个应用程序使用 /bin/sh 运行脚本并将 LD_LIBRARY_PATH 设置为应用程序特定的库。在运行我的 ssh 命令之前临时将 LD_LIBRARY_PATH 设置为空就可以了。
【解决方案2】:
  1. 发现哪个包有 libcrypto.so:yum provides *libcrypto.so
  2. 安装openssl-devel:yum install openssl-devel
  3. 更新包:yum update

【讨论】:

    猜你喜欢
    • 2016-01-11
    • 1970-01-01
    • 2017-07-13
    • 2019-10-07
    • 2018-02-09
    • 2021-01-29
    • 2017-07-08
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多