尽管权限正确,但Web PHP实例仍无法运行可执行文件

时间:2015-11-05 23:10:03

标签: php linux ssh

也许你可以帮我解决一个相当令人沮丧的问题。我无法编译可执行文件,让我们称之为$$execprob,在Linux主机上我正在进行测试,因此在不同的主机上编译它并移动可执行文件。它可以与我的SSH用户一起运行,但是当web服务器使用

exec( "/home/$$username/usr/local/bin/$$execprob", $output, $return );

我没有$output$return是127,或者找不到文件。

以下是我的测试中可能有用的信息列表:

  • 该文件在正常SSH模式下运行良好。
  • 通过SSH获得的权限为-rwxr-xr-x
  • 运行exec( 'ls -l' ),因为网络服务器显示该文件具有与SSH相同的权限
  • SSH中的
  • ${USER}是文件所有者$$用户名
  • PHP中的
  • ${USER}不返回任何内容
  • 正在运行exec( 'if [-x /home/$$username/usr/local/bin/$$execprob]; then echo "thing";fi' )打印出'thing';
  • 在运行php -a的SSH中,输入exec( "/home/$username/usr/local/bin/$$execprob", $output, $return );正确运行$$ execprob,$output显示输出,$return == 0。
  • 我的.bashrc中有一行正确加载$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH;这是可执行文件在使用动态库时运行所必需的。我的.bashrc不是由网络服务器运行的;但是,跑步:

exec( "export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH; /home/$$username/usr/local/bin/$$execprob", $output, $return );

仍然有相同的不成功结果。

如果我还有其他任何事情可以为您收集更多疑难解答信息,请告知我们。

谢谢!

1 个答案:

答案 0 :(得分:0)

问题最终被追溯到$ LD_LIBRARY_PATH环境变量未正确设置。我有这条线:

exec( "export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH;
    /home/$$username/usr/local/bin/$$execprob", $output, $return );

然而,当然,(如上面的@JoelC所述),$HOME命令中的export变量将解析为PHP用户的$HOME。这是通过使用绝对路径修复的:

exec( "export LD_LIBRARY_PATH=/home/$$username/usr/local/lib:$LD_LIBRARY_PATH;
    /home/$$username/usr/local/bin/$$execprob", $output, $return );

值得注意的是,绝对没有输出回来帮助诊断这个,这很奇怪。当我在没有设置$$execprob的情况下从shell运行$LD_LIBRARY_PATH时,它会返回有关丢失的.so文件的错误。为什么这里的输出不会返回相同的错误?或许系统消息的输出类别与实际命令输出相反?我想知道是否有办法在exec()范围内返回这些类型的消息。

但我认为这是另一个帖子的问题......