Загрузить.profile с помощью proc_open()

Вот ситуация: я написал внутреннее приложение, которое работает на определенном сервере. На этом сервере есть сценарий, который может быть выполнен с внешнего сервера через ssh. Затем мой скрипт проверит, правильно ли загружаются необходимые ему переменные окружения, потому что я полагаюсь на них в самом скрипте.

Это работает, хотя не так, как я хочу, чтобы все работало. Когда соединение установлено,./profile не загружается только с помощью exec('source /home/user/.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 в виде массива будет еще глупее. Я также пытался proc_open оболочки, загрузите профиль и снова запустите скрипт изнутри. Только чтобы обнаружить, что скрипт продолжает вызывать себя, что заставляет меня поверить, что профиль вообще не загружен.

Вот моя попытка до сих пор:

#!/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 ответ

Решение

У меня нет 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
Другие вопросы по тегам