【问题标题】:SSH and PHP different behaviorSSH 和 PHP 不同的行为
【发布时间】:2014-08-11 00:27:03
【问题描述】:

我在远程服务器上通过npm 安装了PhantomJS 并将其添加到.bashrc:PATH=~/node/bin:$PATH
如果我在 ssh 控制台中运行 phantomjs -v,那么我会得到预期的结果:1.9.7

现在当我尝试在 PHP 脚本中使用它时:

<?
putenv("PATH=~/node/bin:$_ENV[PATH]");
echo shell_exec('echo $PATH');
echo shell_exec('phantomjs -v 2>&1');

我收到此错误(不是sh: phantomjs: command not found):

~/node/bin:/bin:/usr/bin  
/usr/bin/env: node: No such file or directory

我可以使用完整路径~/node/lib/node_modules/phantomjs/lib/phantom/bin/phantomjs 来获得正确的响应。

但问题是:为什么 php exec() 和 console 的行为不同?
那是因为一些 sh/bash 吗?也许他们正在使用不同的 ENV?

【问题讨论】:

  • 添加echo $_ENV['HOME']。还有echo shell_exec('whoami')。可能很有启发性。 (~ 可能不是你想象的那样。)
  • $_ENV['HOME'] = 未定义索引; whoami 是我在 ssh 和 php 共享主机上的用户名; ~ 是 /home/user
  • 你在你的shell和你的网页都试过了吗?如果不是这样,我正在画一个空白。 (另外,显然是getenv('HOME')$_ENV['HOME'] 确实是“不是”。
  • shell 为echo $HOME 返回/home/user
  • php 不返回 getenv('HOME'),添加 putenv("HOME=~") 后返回 sh: phantomjs: command not found

标签: php node.js shell ssh phantomjs


【解决方案1】:

PHP 以不同的用户 apachenginx 运行。这些用户没有 homedir,所以路径 ~/node/bin 不存在。请添加到 nodejs 的 PATH 全局路径,然后运行您的脚本。

【讨论】:

  • 请检查 cmets,与 /home/&lt;user&gt; 主目录的用户相同。两者都为ls ~/node/bin返回node npm phantomjs
【解决方案2】:

node.js 或 PHP 甚至 CRON 的脚本,使用 FULL PATH 名称来避免这些错误。根据您的配置,PHP 作为用户“www-data”(例如:ubuntu)或“nobody”运行。因此路径不存在。

注意:如果你查看 /etc/ 文件夹,你可以看到使用完整路径的脚本示例

【讨论】:

    【解决方案3】:

    shell_exec 没有从当前进程中获取 ENV 变量。

    不过,您可以使用 passthru

    putenv("HELLO=world");
    passthru("echo \$HELLO");
    // world
    

    值得注意的是passthru也接收STDIN,直接写入STDOUT和STDERR

    【讨论】:

    • 它确实得到了。 putenv('HELLO=world'); echo exec('echo $HELLO'); 返回world
    • 但是putenv() 不使用自己定义的变量。 putenv('H=/home/user');putenv('PATH=$H/node/bin');echo exec('echo $PATH'); 返回$H/node/bin
    猜你喜欢
    • 2017-10-28
    • 2023-03-20
    • 1970-01-01
    • 2021-10-16
    • 2021-04-07
    • 2012-05-21
    • 2015-12-16
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多