使用proc_open()加载.profile

时间:2012-03-23 17:13:05

标签: pipe php proc-open

以下是这种情况:我编写了一个在某个服务器上运行的后端应用程序。在此服务器上,有一个脚本可以通过ssh从前端服务器执行。然后我的脚本将检查它所需的环境变量是否正确加载,因为我在脚本本身严重依赖它们。

虽然不是我想让事情发挥作用的方式,但这仍然有效。当建立连接时,仅使用exec('source /home/user/.profile');加载./profile当然不起作用。由于脚本已经运行。 这就是脚本开始的原因:

#!/to/php/bin/php -n
<?php
    if (!$_SERVER['VAR_FROM_PROFILE'])
    {
        exec('/absolute/path/to/helperscript '.implode(' ',$argv),$r,$s);
        if ($s !== 0)
        {
            die('helper script fails: '.$s);
        }
        exit($r[0]);
    }

该助手脚本是一个ksh脚本:

#!/path/ksh
source /.profile
$*

加载配置文件,然后再次调用第一个脚本。 我希望第二个脚本消失,我发现它很愚蠢......需要第二个脚本来运行第一个脚本。我知道可以使用proc_open设置环境值,但是将.profile重写为数组soud甚至更傻。 我还尝试proc_open一个shell,加载配置文件并从内部再次运行脚本。只是发现脚本一直在调用自己,导致我相信配置文件根本没有加载。

到目前为止,这是我的尝试:

#!/to/php/bin/php -n
<?php
    if (!$_SERVER['VAR_FROM_PROFILE'] && $argv[1] !== 'fromself')
    {
        $res = proc_open('ksh',array(array('pipe','r'),array('pipe','w'),array('pipe','w')),$pipes);
        usleep(5);
        fwrite($pipes[0],'source /home/user/.profile & '.$argv[0].' fromself');
        fclose($pipes[0]);//tried using fflush and a second fwrite. It failed, too
        usleep(1);
        echo stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        proc_close($res);
        exit();
    }
    var_dump($_SERVER);
?>

到目前为止,我没有运气,有人能告诉我,如果我忘了这里的话吗?我究竟做错了什么?我在这里忽略了什么吗?

1 个答案:

答案 0 :(得分:4)

我没有ksh,但我已设法使用bash

<强> /home/galymzhan/.bash_profile

export VAR_FROM_PROFILE="foobar"

<强> /home/galymzhan/test.php

#!/usr/bin/php -n
<?php
if (!isset($_SERVER['VAR_FROM_PROFILE'])) {
  $descriptors = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'));
  $process = proc_open('bash', $descriptors, $pipes);
  fwrite($pipes[0], escapeshellcmd('source /home/galymzhan/.bash_profile') . "\n");
  fwrite($pipes[0], escapeshellcmd('/home/galymzhan/test.php') . "\n");
  fclose($pipes[0]);
  echo "Output:\n";
  echo stream_get_contents($pipes[1]);
  echo "\n";
  fclose($pipes[1]);
  proc_close($process);
  exit;
}
print "Got env var {$_SERVER['VAR_FROM_PROFILE']}\n";
// Useful part of the script begins

输出我得到了:

[galymzhan@dinohost ~]$ ./test.php 
Output:
Got env var foobar