Domanda

Here's the situation: I wrote a back end application, that runs on a certain server. On this server, there is a script that can be executed from the front end server, over ssh. My script will then check to see if the environment variables it needs are loaded correctly because I rely heavily on them in the script itself.

This works, although not the way I want things to work. As the connection is established, the ./profile isn't loaded just using exec('source /home/user/.profile'); doesn't work, of course. Since the script is already running. That's why the script starts like this:

#!/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]);
    }

That helper script is a ksh-script:

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

loading the profile, and calling the first script again. I want this second script gone, I find it silly... needing a second script to run the first. I know that it is possible to set environment values with proc_open, but rewriting the .profile as an array souds even sillier. I also tried to proc_open a shell, load the profile and run the script again from within itself. Only to find that the script keeps calling itself, leading me to believe the profile isn't loaded at all.

Here's my attempt so far:

#!/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);
?>

I had no luck with this so far, can anyone tell me if I'm forgetting something here? What am I doing wrong? Am I overlooking something here?

È stato utile?

Soluzione

I don't have a ksh, but I've managed to do it with 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

Output I've got:

[galymzhan@dinohost ~]$ ./test.php 
Output:
Got env var foobar
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top