ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用proc_open()管道加载.profile

2019-11-01 14:29:59  阅读:252  来源: 互联网

标签:proc-open php pipe


情况是这样的:我编写了一个在特定服务器上运行的后端应用程序.在此服务器上,可以通过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重写为数组可能会更加愚蠢.
我还尝试过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);
?>

到目前为止,我还没有运气,有人能告诉我我是否在这里忘记了什么吗?我究竟做错了什么?我在这里俯瞰什么吗?

解决方法:

我没有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

标签:proc-open,php,pipe
来源: https://codeday.me/bug/20191101/1984355.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有